Guten Morgen zusammen,
ich habe folgende Methode:
public class MapperBase<T> where T : class
{
public T Map()
{
// get Type of T
Type t = typeof(T);
// get all Properties
PropertyInfo[] infos = t.GetProperties();
// run through properties
foreach (PropertyInfo pi in infos)
{
object[] attribs = pi.GetCustomAttributes(typeof(MapAttribute), true);
// did we have an MapAttribute ?
if ( (attribs != null) && (attribs.Length > 0) )
{
// Hier kracht es mit der Meldung
// Object does not match target type
pi.SetValue( t, value, null );
}
}
}
}
Ich bekomme bei dem "pi.SetValue(...)" eine TargetException, sehe aber grade das Problem nicht.
Wie kann für "T" Werte seiner Properties setzen ?
Vielen herzlichen Dank.
Gruß
DevHB
Hallo DevHB,
die Fehlermeldung ist doch eindeutig. Der Wert, den du setzen willst, passt nicht zu dem Typ der Property.
herbivore
Hallo,
mmh, ich dachte, die Meldung würde auf t (= typeof(T) ) zielen.
T ist in meinem Fall eine simple Klasse mit 3 Properties (alle String).
Wenn ich nun
string s ="test";
pi.SetValue (t , s, null);
mache, bekomme ich immer noch die gleiche Meldung.
"pi" ist vom Type System.String.
Vielen Dank.
Gruß
DevHB
Hallo DevHB,
statt t musst du natürlich das Objekt angeben, dessen Property du setzen willst.
public virtual void SetValue ( Object obj, Object value, Object[] index )
obj
Das Objekt, dessen Eigenschaftenwert festgelegt wird.
Ein Blick in die :rtfm: Doku vor dem Posten schadet also nichts.
herbivore
du musst an SetValue ja auch eine Instanz des Typs, nicht das Typobjekt, übergeben. Bei statischen properties müsste man den ersten Parameter gämzlich weglassen (null), der zweite Parameter ist immer der Wert und der dritte, ja, der dritte sind die Parameter für den Aufruf. Als C#er gibt es aber genau eine Art von parametrisierten properties, nämlich Indexer. Aber wenn du Code aufrufst, der e.g. in VB.NET geschrieben wurde, dann ist da tw. auch ein dritter Parameter notwendig.