런타임에만 알 수있는 속성 형식을 가져와 일반 메서드의 형식 매개 변수로 전달해야합니다. 예를 들어 :일반 메서드로 전달할 속성 형식 가져 오기
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);
}
나는 사람이 가질 수있는 다른 제안에 열려있어, 또는 코드가 뒤로 샷 밖으로 이동해야, 하지만 내 원래의 질문은 여전히 내가 가장 관심이있는 것입니다.
리플렉션을 통해 메소드를 호출 할 수 있지만 이것이 올바른 해결책인지는 분명하지 않습니다. –
이 질문보기 : http://stackoverflow.com/questions/266115/pass-an-instantiated-system-type-as-a-type-parameter-for-a-generic-class – Ray
'Foo' 일단 그것이 그것이 무엇인지 안다면 'T'형과 관련이 있는가? 'Foo'의 실제 구현은'void Foo (T val)'과 더 비슷합니까? –