如何动态使用PropertyType反射属性来创建相应的类型函数<>?

时间:2010-05-05 18:31:12

标签: c# reflection gettype

我想使用PropertyType返回的类型来创建一个类型化的函数。我发现这个相似 using type returned by Type.GetType() in 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 个答案:

答案 0 :(得分:1)

只需使用MakeGenericType(new Type[] { SomeClass, T })

编辑更多详情:

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

答案 1 :(得分:1)

您可以创建表达式树,但不能在代码中声明其类型。你有这个地方:

Expression<Func<SomeClass,T>> le = ...
必须在编译时(或者是类型参数)知道

T。相反,您的T变量,其值仅在执行时间时知道。

现在,接下来的问题是你是否真的需要它 - 或者你需要什么方式。你想用表达式做什么?你能否仅使用非泛型Expression类作为变量类型?

如果你真的想要一个表达式树,你不必担心MakeGenericType等 - 使用Expression.Property方法。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

如果您想使用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方法是公共静态方法。