Мне нужно получить тип свойства, которое будет известно только во время выполнения, и передать его в качестве параметра типа для универсального метода. Например:
PropertyInfo prop = Bar.GetProperty("Property1");
//"type 'prop' could not be found" error
Foo<prop.PropertyType>();
void Foo<T>()
{
//Stuff
}
class Bar
{
string Property1{get;set;}
}
Тип Bar.Property1 не будет известен во время компиляции, поэтому я не могу сделать Foo<string>();
. Он будет правильно компилироваться и работать, если я использую Foo<dynamic>();
, но я не уверен, что это лучший способ, и я хотел бы знать, есть ли способ сделать это, используя более старую среду.
Надеюсь, этот более полный пример прояснит мои намерения:
public void Map(TInType inObject, TOutType outObject)
{
//propertyIn, propertyOut, and converter are all strings identifying the properties/methods to be used from the inObject/Type outObject/Type.
SetPropertyValues<dynamic, dynamic>(inObject, outObject, propertyIn, propertyOut, converter);
}
private void SetPropertyValues<TPropIn,TPropOut>(TInType fromObject, TOutType toObject, string propertyIn, string propertyOut, string converter)
{
PropertyInfo prop1 = typeof(TInType).GetProperty(propertyIn);
MethodInfo converterMethod = typeof(TInType).GetMethod(converter);
PropertyInfo prop2 = typeof(TOutType).GetProperty(propertyOut);
prop2.SetValue(
toObject,
CopyPropertyValue<TPropIn, TPropOut>((TPropIn)prop1.GetValue(fromObject, null), p => (TPropOut)converterMethod.Invoke(fromObject, new object[] { p })),
null);
}
private TPropOut CopyPropertyValue<TPropIn, TPropOut>(TPropIn InPropValue, Func<TPropIn, TPropOut> converterFunction)
{
return converterFunction(InPropValue);
}
Я открыт для любых других предложений, которые могут быть у кого-либо, или для того, чтобы код был взят обратно и снят, но мой первоначальный вопрос по-прежнему наиболее интересен.