Как динамически использовать атрибут отражения PropertyType для создания соответствующей типизированной функции <>? - PullRequest
1 голос
/ 05 мая 2010

Я хочу использовать тип, возвращаемый PropertyType, для создания типизированной функции. Я нашел это похоже используя тип, возвращаемый Type.GetType () в c # но здесь упоминается, как создать список, но не упоминается, как мы можем создать Func <>. Пожалуйста, помогите мне.

псевдокод:

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;
}

Ответы [ 4 ]

1 голос
/ 05 мая 2010

Если вы хотите вызвать GetPropertyOrFieldByName с PropertyType, это должно работать:

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 является публичным статическим методом.

1 голос
/ 05 мая 2010

Вы можете создать дерево выражений, но не можете объявить его тип в коде.Где вы получили это:

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

T должно быть известно во время компиляции (или быть параметром типа).Вместо этого ваша T - это переменная , значение которой известно только в время выполнения .

Теперь, следующий вопрос: действительно ли вам это нужно в любом случае - иликаким способом вам это нужно.Что вы пытаетесь сделать с выражением?Не могли бы вы просто использовать в качестве типа переменной неуниверсальный класс Expression?

Если вы действительно хотите дерево выражений, вам не нужно беспокоиться о MakeGenericType и т. Д. - используйте метод Expression.Property.

1 голос
/ 05 мая 2010
Type parameter = ...;
Type result = ...;
Type your_type = typeof(Func<,>).MakeGenericType(new Type[] {parameter, result});
1 голос
/ 05 мая 2010

Просто используйте MakeGenericType(new Type[] { SomeClass, T }).

РЕДАКТИРОВАТЬ Подробнее:

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

...