InvokeMember mit Int16/short und byte

19/11/2009 - 12:03 von Heiko Müller | Report spam
Hallo,

ich stehe vor einem - für mich unerklàrlichen Problem -, dass ich am
besten anhand eines Stückchen Codes beschreibe:

public class Test
{
private int _TestInt;
private short _TestShort;
private byte _TestByte;
private Int16 _TestInt16;

public int TestInt
{
get { return _TestInt;}
set { _TestInt=value;}
}

public short TestShort
{
get { return _TestShort;}
set { _TestShort=value;}
}

public byte TestByte
{
get { return _TestByte;}
set { _TestByte=value;}
}

public Int16 TestInt16
{
get { return _TestInt16;}
set { _TestInt=value16;}
}

public Test()
{

}
}


Test oTest=new Test();

Type type = oTest.GetType();
// Diese Zeile funktioniert wie gewünscht
type.InvokeMember("TestInt", BindingFlags.SetProperty |
BindingFlags.SetField | BindingFlags.Public | BindingFlags.Instance |
BindingFlags.IgnoreCase, null, oTest, new obj[] { 1 });

// Diese Zeile ergibt eine MissingMethodException
type.InvokeMember("TestShort", BindingFlags.SetProperty |
BindingFlags.SetField | BindingFlags.Public | BindingFlags.Instance |
BindingFlags.IgnoreCase, null, oTest, new obj[] { 1 });

// Diese Zeile ergibt eine MissingMethodException
type.InvokeMember("TestByte", BindingFlags.SetProperty |
BindingFlags.SetField | BindingFlags.Public | BindingFlags.Instance |
BindingFlags.IgnoreCase, null, oTest, new obj[] { 1 });

// Diese Zeile ergibt eine MissingMethodException
type.InvokeMember("TestInt16", BindingFlags.SetProperty |
BindingFlags.SetField | BindingFlags.Public | BindingFlags.Instance |
BindingFlags.IgnoreCase, null, oTest, new obj[] { 1 });

InvokeMember scheint bei allen möglichen Typen zu funktionieren nur
short/Int16 und byte funktionieren nicht. Hat jemand eine Ahnung waran
das leigen kann und wie man den Fehler/das Problem ungehen könnte?

Danke schonmal...

Heiko Müller
 

Lesen sie die antworten

#1 Elmar Boye
19/11/2009 - 12:29 | Warnen spam
Hallo Heiko,

"Heiko Müller" schrieb ...
ich stehe vor einem - für mich unerklàrlichen Problem -, dass ich am besten anhand eines Stückchen Codes beschreibe:



Es ist empfehlenswert, ein bißchen mehr Grundlagen zu pauken,
bevor man sich an Reflection wagt.

// Diese Zeile ergibt eine MissingMethodException
type.InvokeMember("TestShort", BindingFlags.SetProperty | BindingFlags.SetField | BindingFlags.Public | BindingFlags.Instance |
BindingFlags.IgnoreCase, null, oTest, new obj[] { 1 });



In diesen schlàgt das Nachschlagen fehl, weil es keine implizite
Konvertierung von Integer auf Short gibt.
http://msdn.microsoft.com/de-de/lib...77ex4.aspx

Und der DefaultBinder solche Dinge berücksichtigt:
http://msdn.microsoft.com/de-de/lib...inder.aspx

Mit einem new object[] { (short)1 } funktioniert es dann.

Und in allen weiteren Fàllen gilt es àquivalent.
Grundsàtzlich kann implizit nur konvertiert werden,
wenn kein Datenverlust auftreten kann.

Nebenbei: Beim Abrufen des Members solltest Du Dich auf SetProperty
oder SetField festlegen, damit es nicht zu Überraschungen kommt.

Gruß Elmar

Ähnliche fragen