我想使用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;
}
答案 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
方法是公共静态方法。