代码之家  ›  专栏  ›  技术社区  ›  Vishal

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

  •  1
  • Vishal  · 技术社区  · 15 年前

    我想使用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 回复  |  直到 15 年前
        1
  •  1
  •   Steven    15 年前

    如果你想打电话给 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" });
    

    假设 按名称获取属性或字段 方法是公共静态方法。

        2
  •  1
  •   Eric Mickelsen    15 年前

    简单使用 MakeGenericType(new Type[] { SomeClass, T }) .

    编辑 更多详细信息:

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

    ,

        3
  •  1
  •   mfeingold    15 年前
    Type parameter = ...;
    Type result = ...;
    Type your_type = typeof(Func<,>).MakeGenericType(new Type[] {parameter, result});
    
        4
  •  1
  •   Jon Skeet    15 年前

    可以创建表达式树,但不能在代码中声明其类型。你从哪里得到这个:

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

    T 必须在 编译时间 (或是类型参数)。相反,你的 T 是一个 变量 其值仅在 执行时间 .

    现在,下一个问题是你是否真的需要这个——或者在什么方面 方式 你需要它。你想用这个表达做什么?你能用一下非能量的吗 Expression 是否将类改为变量类型?

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