正确的签名在课堂上使用的getMethod使用,具有多个要求委托参数的多个过载的通用方法



在答案之后符合问题的部分内容是一些其他信息,希望能解决问题

开始编辑

var curEntityPI = ctx.GetType().GetProperties().Where(pr => pr.Name == "Client").First(); Type curEntityType = curEntityPI.PropertyType.GetGenericArguments().First(); Type[] typeArgs = { curEntityType }; Type propertyManagerType = generic.MakeGenericType(typeArgs); var propertyManager = Activator.CreateInstance(propertyManagerType, new object[] {});

考虑到这一点,我不能以第一个答案中显示的方式使用cockemethod.invoke,而我不知道在调用时不知道该如何放置

时, 我不知道该如何放置

结束编辑

方法签名应该是什么样的反思,我正在尝试调用此等效

DynamicPropertyManager<ThreeColumns>.CreateProperty<ThreeColumns, string>(
     "Four",
     t => "Four",
     null
  ));

在此类中找到此处http://putridparrot.com/blog/dynamacy-exting-an-bocks-properties-using-typedescriptor/

  1. ,但我正在尝试使用反射来做到这一点。我正在挣扎的最多的是获得正确的方法过载。

  2. 我必须说实话,尽管我也不完全确定如何通过反思为lambda位提供正确的论点

我要部分尝试,但不知道功能有什么位 在做makegenericMethod

时看起来像
Func<string> funcArg = () => { return "Four"; };

object[] args = { fieldOrPropertyName , funcArg, null };

包括上面链接中的类内容用于参考。

public class DynamicPropertyManager<TTarget> : IDisposable
{
    private readonly DynamicTypeDescriptionProvider provider;
    private readonly TTarget target;
    public DynamicPropertyManager()
    {
        Type type = typeof(TTarget);
        provider = new DynamicTypeDescriptionProvider(type);
        TypeDescriptor.AddProvider(provider, type);
    }
    public DynamicPropertyManager(TTarget target)
    {
        this.target = target;
        provider = new DynamicTypeDescriptionProvider(typeof(TTarget));
        TypeDescriptor.AddProvider(provider, target);
    }
    public IList<PropertyDescriptor> Properties
    {
        get { return provider.Properties; }
    }
    public void Dispose()
    {
        if (ReferenceEquals(target, null))
        {
            TypeDescriptor.RemoveProvider(provider, typeof(TTarget));
        }
        else
        {
            TypeDescriptor.RemoveProvider(provider, target);
        }
    }
    public static DynamicPropertyDescriptor<TTargetType, TPropertyType>
       CreateProperty<TTargetType, TPropertyType>(
           string displayName,
           Func<TTargetType, TPropertyType> getter,
           Action<TTargetType, TPropertyType> setter,
           Attribute[] attributes)
    {
        return new DynamicPropertyDescriptor<TTargetType, TPropertyType>(
           displayName, getter, setter, attributes);
    }
    public static DynamicPropertyDescriptor<TTargetType, TPropertyType>
       CreateProperty1<TTargetType, TPropertyType>(
          string displayName,
          Func<TTargetType, TPropertyType> getHandler,
          Attribute[] attributes)
    {
        return new DynamicPropertyDescriptor<TTargetType, TPropertyType>(
           displayName, getHandler, (t, p) => { }, attributes);
    }
    public static DynamicPropertyDescriptor<TTargetType, TPropertyType>
       CreateProperty<TTargetType, TPropertyType>(
          string displayName,
          Func<TTargetType, TPropertyType> getHandler,
          Attribute[] attributes)
    {
        return new DynamicPropertyDescriptor<TTargetType, TPropertyType>(
           displayName, getHandler, (t, p) => { }, attributes);
    }
}

反射和仿制药的运作良好,但是如何实现特定目标非常取决于上下文,因为可能封闭,开放和部分封闭的类型和方法。但是,通常很容易使用LINQ来获取所需的东西。看看:

// get type from somewhere
var compileTimeUnknownType = Type.GetType("ThreeColumns");
if (compileTimeUnknownType == null)
    throw new ArgumentException("compileTimeUnknownType");
var managerType = typeof (DynamicPropertyManager<>).MakeGenericType(compileTimeUnknownType);
var createPropertyMethod = managerType.GetMethods().Single(x =>
{
    var p = x.GetParameters();
    var g = x.GetGenericArguments();
    return x.Name == "CreateProperty" &&
            p.Length == 3 &&
            g.Length == 2 &&
            p[0].ParameterType == typeof (string) &&
            p[1].ParameterType == typeof (Func<,>).MakeGenericType(g) &&
            p[2].ParameterType == typeof (Attribute[]);
});
var closedMethod = createPropertyMethod.MakeGenericMethod(new[] {compileTimeUnknownType, typeof (string)});
var paramExpr = Expression.Parameter(compileTimeUnknownType, "arg");
var lambda =
    Expression.Lambda(typeof (Func<,>).MakeGenericType(new[] {compileTimeUnknownType, typeof (string)}),
        Expression.Constant("Four"), new List<ParameterExpression>() {paramExpr}).Compile();
var ret = closedMethod.Invoke(null, new object[] {"Four", lambda, null});

相关内容

  • 没有找到相关文章

最新更新