2010-05-05 3 views
1

PropertyType에 의해 반환 된 형식을 사용하여 형식화 된 함수를 만들려고합니다. 이 유사 함을 알았습니다 using type returned by Type.GetType() in c# 그러나 목록을 작성하는 방법에 대해서는 언급했지만 Func <>을 만드는 방법은 언급하지 않았습니다. 제발 도와주세요.PropertyType 반사 특성을 동적으로 사용하여 각각의 형식화 된 함수 <>를 만드는 방법은 무엇입니까?

의사 코드 :

PropertyInfo inf = typeof(SomeClass).GetProperty("PropertyName"); 
Type T=inf.PropertyType; 
Expression<Func<SomeClass,T>> le = GetPropertyOrFieldByName<SomeClass,T>("PropertyName"); 

static Expression<Func<TSource, TResult>> GetPropertyOrFieldByName<TSource,TResult>(string propertyOrFieldName) 
{ 
ParameterExpression item = Expression.Parameter(typeof(TSource), "expr");MemberExpression prop = LambdaExpression.PropertyOrField(item, propertyOrFieldName); 
var expr = Expression.Lambda<Func<TSource, TResult>>(prop, new ParameterExpression[] { item }); 
expr.Compile(); 
return expr; 
} 
+0

달성하고자하는 의사 코드를 표시 할 수 있습니까? 귀하의 질문은 다소 모호합니다. – Steven

+0

대리인의 인스턴스를 만들려면 어떻게 하시겠습니까? – Andrey

+0

죄송합니다. 다소 모호하다면 여기에 코드가 있습니다.이 코드는 내가하고 싶은 코드입니다 ... PropertyInfo inf = typeof (SomeClass) .GetProperty ("PropertyName"); 유형 T = inf.PropertyType; Expression > le = GetPropertyOrFieldByName ("PropertyName"); – Vishal

답변

1

이 작동합니다 :

PropertyInfo inf = typeof(SomeClass).GetProperty("PropertyName"); 
Type T = inf.PropertyType; 

object le = 
    typeof([TypeThatDeclaresMethod]).GetMethod("GetPropertyOrFieldByName") 
    .MakeGenericMethod(typeof(SomeClass), T) 
    .Invoke(null, new object[] { "PropertyName" }); 

GetPropertyOrFieldByName 방법은 공공 정적 방법이라고 가정.

+0

안녕하세요 위의 방법을 사용하려고했지만 null 참조 예외가 ... 나는 메서드에서 목록을 얻고 싶습니다 및 TypeThatDeclaresMethod 클래스를 의미합니다. 메서드 또는 반환 형식이 있습니까? .sorry 나는 반사에 익숙하지 않습니다. 그래서 위의 코드에 GetPropertyOrFieldByName을 추가했습니다. 도와주세요. – Vishal

+1

'[TypeThatDeclaresMethod]'는 방법.그래서 'GetPropertyOrFieldByName'을 포함하는'Program'이라는 클래스가 있다면, 당신의 호출은'typeof (Program) .GetMethod ("GetPropertyOrFieldByName")'이 될 것입니다. – Steven

+0

안녕하세요, 고마워요. 실제로는 메소드가 공개되어 있지 않아 null이 반환되었으므로 Exrain 값이있는 객체 변수가 있으므로 tostring을 어떻게 변환합니까?이 문자열 변수를 표현식으로 사용하는 방법은 무엇입니까? – Vishal

1

간단히 MakeGenericType(new Type[] { SomeClass, T })를 사용합니다.

편집 더 많은 세부 사항 :

Type T2 = typeof(Excpression<>).MakeGenericType(typeof(Func<,>).MakeGenericType(new Type[] { SomeClass, T })); 
... Activator.CreateInstance(T2); 

,

1

당신은 식 트리를 만들 수 있습니다,하지만 당신은 코드의 유형을 선언 할 수 없습니다. 당신이있어 곳 :

Expression<Func<SomeClass,T>> le = ... 

T은 (유형 매개 변수 또는 수) 시간 컴파일 알려진되어야한다. 대신 T변수이며 그 값은 실행 시간에만 알려져 있습니다.

자, 다음 질문은 당신이 정말로 그것을 필요로하는지 여부입니다. 또는 무엇이 방법 필요합니다. 표현으로 무엇을하려고합니까? 대신 변수 유형으로 nongeneric Expression 클래스를 사용할 수 있습니까?

진정한 표현식 트리를 원한다면 MakeGenericType 등을 걱정할 필요가 없습니다. Expression.Property 메서드를 사용하십시오. 당신이 PropertyType으로 GetPropertyOrFieldByName를 호출 할 경우

1
Type parameter = ...; 
Type result = ...; 
Type your_type = typeof(Func<,>).MakeGenericType(new Type[] {parameter, result});