|
That's not his problem. He's calling contactGetType().GetField(...) , which is correct. This compiles into the following psuedocode:
Type t = contact.GetType();
FieldInfo fi = t.GetField(...);
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Sustained Engineering
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
Hello,
i have a object contact that contains:
* firstname
* lastname
* emailaddress
and now i placed in the var "column" the value firstname and in var "theValue" myaddress@address.com but when i do a watch on contact the value still is null! how is this possible? this is the statement:
contact.GetType().GetField(column).SetValue(contact, theValue)
plz help me out
greetings
Sander
|
|
|
|
|
Gedrain wrote:
but when i do a watch on contact the value still is null!
What value? contact ? Make sure you instantiate it.
Also keep in mind that members are case-sensitive. Since - for a good OO design with .NET - you should be exposing properties and not fields as public or protected members, if you're using GetField you must be writing to private members, right? (That's the correct way of doing it). If you are writing to private members, then you need to use the overloaded GetField to pass BindingFlags.Instance | BindingFlags.NonPublic in order to get a private field.
If these are properties, you need to use GetProperty , subject to the same rules (if the property - or any member - is not public you need to pass BindingFlags.NonPublic since the overload without a BindingFlags param assume public accessibility).
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Sustained Engineering
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
hello,
well they are not properties but fields i looked that up in the fieldinfo object and it said it was a Field object because when i use property to retrieve it didn't work
WAB.NKTWABContact contact = new NKTWABLib.NKTWABContact();
string theValue = "MyName"
string column = "FirstName"
contact.FirstName = "test"; //is a field type and not a property and this work
contact.GetType().GetField(column).SetValue(contact, theValue);
but this above didn't work how come I need to do it the way above and not this way
contact.FirstName = "test"
the FirstName is public i think the contact object is inside a module that i didn't make so that is only thing i know.
greetings
Sander
|
|
|
|
|
I didn't say it was a property, I said if it was a property. You didn't give a lot of detail so all we can do is guess. You have a problem and you need to define it better if you expect any sort of help.
Once again, what is the member accessibility (public, protected, protected internal, internal, or private) of the field "FirstName"?
If you can't assign it as contact.FirstName then more than likely the member is not public (i.e., you can't assign it or even access it from outside code - not even a different instance of the same class if the member is private).
You should read Access Modifiers[^] in the MSDN Library for more information about access modifiers and member accessibility.
If the field is not public, then you need to use reflection and the code would look something like this (this is an example, mind you):
WAB.NKTWABContact contact = new WAB.NKTWABContact();
FieldInfo firstName = contact.GetType().GetField("FirstName",
BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
if (firstName != null)
{
firstName.SetValue(contact, "test");
}
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Sustained Engineering
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
well i can access the field contact.FirstName that is not the problem but i store the fieldnames in a collection so that is way i wanna loop through my collections of fieldnames and place the value in it.
greetings
Sander
|
|
|
|
|
Why don't you post the actual code? You're not giving us enough to see what you're doing wrong.
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Sustained Engineering
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
WAB.NKTWABContact contact = new NKTWABLib.NKTWABContact();
for (int i=0; i < FieldNames.Count; i++)
{
string column = (string)FieldNames.GetKey(i);
if (dr[column] != System.DBNull.Value)
{
contact.GetType().GetField(column, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public).SetValue(contact,dr[column]);
dr is a datarow object. The statement doesn't return any errors or so it just continues but no value is visible
greetings
Sander
|
|
|
|
|
I'm assuming that each field is a string, so you need to use dr[column].ToString() after, of course, checking that the return value of dr[column] isn't null (so you're not, essentially, calling null.ToString() , which throws a NullReferenceException , a far too oftenly seen exception that should never be thrown to users).
You need to use the same type or the value can't be set.
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Sustained Engineering
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
that is allready being tested at
if (dr[column] != System.DBNull.Value)
but when i place
contact.GetType().GetField(column, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public).SetValue(contact,"test");
that doesn't work also not and yes each field is a string it is really weird why it doesn't work....
greetings
Sander
|
|
|
|
|
An exception should be thrown. You don't have this code in try-catch already, do you? If the field can't be found, an exception is thrown. The the value type and field types don't match, an exception is thrown. If any of the objects are null an exception is thrown.
Setting values through reflection works - I've done it hundreds of times in a very similar fashion. What I'm not seeing is the relevent code necessary to see what is wrong. You posted your for loop, fine. But what about the contact variable type?
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Sustained Engineering
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
the field is found that is not the problem it returns nice a fieldinfo object and setting the value also doens't throw a exception. It's really weird everything looks allright but the value isn't set.
|
|
|
|
|
What does FieldInfo.MemberType return?
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Sustained Engineering
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
MemberType = Field
it says in the watch in visual studio
|
|
|
|
|
I'm sorry, I meant FieldInfo.FieldType .
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Sustained Engineering
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
+ FieldType {"System.String"} System.Type
|
|
|
|
|
The GetType method returns a Type object, and that is what you are working with, not your contact object.
|
|
|
|
|
I have been trying to use the secondary buffer in dx 9's directSound to play back short wav files. In particular I want to play a tic sound to denote a second of time having taken place. The problem that I am having is that the routine will play fairly long sounds but will not play sounds that are approximately less than 1k in length. Instead it throws an exception and declares that the buffer is too small.
Does anyone know any more information about this scenario? What are my options?
Thanks for any advice.
Codesmith
|
|
|
|
|
Here is an example of the code that I am using to perform this task:
private DS.Device snd;
private DS.SecondaryBuffer tic;
snd = new DS.Device();
snd.SetCooperativeLevel(this, DS.CooperativeLevel.Normal);
tic = new DS.SecondaryBuffer(MediaUtilities.FindFile("tic.wav"), snd);
tic.Play(0, DS.BufferPlayFlags.Default);
For average size wav files this routine works fine but for short ones it throws the buffer too small exception.
|
|
|
|
|
:smirk: Leave it to me to answer my own question eventually. Just in case someone out there runs into the same problem that I did I guess I will throw this out there.
It turns out that DirectSound Secondary buffers can perform Effects Processing... but in order to do so the sound file must be at LEAST a certain size. Since I am loading tiny .wav files the bufferTooSmall exception is getting tossed.
The buffer size is not great enough to enable effects processing.
So now the question is thus, will disabling effects processing be enough to make this error go away? Or can I just catch it and ingore it?
|
|
|
|
|
I have created this C#.NET windows services. This windows service watchs the file system to see if any word documents has been changed or moved directories. This it has then it puts a timestamp sentence in the word document.
This problem is this. I created a C#.net dll or the word portion or the application. Now when I test this dll out with a windows application it works great. But when I call the dll from my windows service it seems to hang. The winword.exe just hangs and so the does the code in the dll. Does anyone know why?
Nicholas Ingratta
ningratt@hotmail.com
|
|
|
|
|
The service needs to run either as a particular user (not the default SYSTEM) or has to be able to interact with the desktop (if a user is currently logged in; the former approach is better if you don't want to require that the machine be logged into 24/7/365.25).
If you're using the ServiceInstaller and ServiceProcessInstaller , you can do this in code (NEVER hard-code your password; accept it from the command-line where the parameters are passed to you through the Context.Parameters property (Context is actually a property of the Installer class, which you extend for your own installer).
If there is no window station associated with the user context, the Windows application cannot start (there's no window manager).
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Sustained Engineering
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
in my project I have serviceProcessInstaller1. If I look at the properties which ones to I have to change then.
This does not really make sense to me since this is windows service and a user may never log in or a desktop ever be used.
Is there anyway you could walk me through some of the steps. Thanks for the help
Nicholas Ingratta
ningratt@hotmail.com
|
|
|
|
|
It should be obvious: Username and Password .
It makes perfect sense if you understand Windows. Word is a Windows program. Whether or not it is visible, it requires a Window manager. If a service isn't associated with a user login - or can't interact with the currently logged in user - there's no window manager and the Windows program (i.e., Word) won't run.
So, you need to run your service as a user that can log in interactively. This doesn't mean that a login session as you'd normally see it as a human user would exist, just that the system impersonates the user given their credentials and creates a window station under that user's contect. This is necessary.
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Sustained Engineering
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
I tried what you said and that worked great. Word actually will run and not hang. But now I seem to have another issue. My word class for some reason gets an error everytime I try to add a paragraph at the end of the document. The error I recieved is "The Server threw an exception". Here is my code. I guess I am doing something wrong. It always fails that the with wordPara.Range.Text = "whatever". Could you help me out again.
wordApp = new Word.ApplicationClass();
wordApp.Visible = (bool) isVisible;
if ( wordApp != null )
{
wordDoc = wordApp.Documents.Open(ref _fileName,ref missing,
ref readOnly,ref missing,
ref missing,ref missing,ref missing
,ref missing, ref missing
,ref missing, ref missing,
ref isVisible,ref missing,
ref missing, ref missing);
object wordRng = wordDoc.Bookmarks.Item(ref oEndOfDoc).Range;
string strDateTime = DateTime.Now.Month.ToString() + "/" + DateTime.Now.Day.ToString() + "/" + DateTime.Now.Year.ToString() + " "
+ DateTime.Now.Hour.ToString() + ":" + DateTime.Now.Minute.ToString();
Word.Paragraph wordPara;
wordPara = wordDoc.Content.Paragraphs.Add(ref wordRng);
//it fails right after this comment
wordPara.Range.Text = "Original electronically authenticated by " + physName + " on " + strDateTime;
wordPara.Range.Font.Bold = 1;
wordPara.Range.InsertParagraphAfter();
if ( sign && ( signLocation.Length > 0 ) )
{
wordRng = wordDoc.Content.Paragraphs.Last.Range;
wordDoc.Content.InlineShapes.AddPicture(_fileSignature, ref missing
,ref missing, ref wordRng);
}
wordDoc.Save();
wordDoc.Close(ref missing, ref missing, ref missing);
wordApp.Quit(ref TBoolean, ref missing, ref missing);
Nicholas Ingratta
ningratt@hotmail.com
|
|
|
|