【问题标题】:How to pass variable of type "Type" to generic parameter如何将“Type”类型的变量传递给泛型参数
【发布时间】:2010-02-11 20:39:33
【问题描述】:

我正在尝试这样做:

Type type = Type.GetType(string.Format("Gestor.Data.Entities.{0}, Gestor.Data", e.Item.Value));
MetaDataUtil.GetColumnasGrid<type>();

但它不起作用,你知道我该怎么做吗?

【问题讨论】:

标签: c# generics


【解决方案1】:

您需要为此使用反射。

var method =
    typeof(MetaDataUtil)
    .GetMethod("GetColumnasGrid")
    .MakeGenericMethod(new [] { type })
    .Invoke(null, null);

【讨论】:

    【解决方案2】:

    如果是实例方法而不是静态方法,则将变量传递给Invoke(第二个参数null是您通常传递给方法的参数数组,在null的情况下就像调用一个没有参数的方法.GetColumnAsGrid()):

    Type genericTypeParameter = Type.GetType(string.Format("Gestor.Data.Entities.{0}, Gestor.Data", e.Item.Value));
    MetaDataUtil someInstance = new MetaDataUtil();
    
    var returnResult =
        typeof(MetaDataUtil)
        .GetMethod("GetColumnsAsGrid")
        .MakeGenericMethod(new [] { genericTypeParameter })
        .Invoke(someInstance, null);//passing someInstance here because we want to call someInstance.GetColumnsAsGrid<...>()
    

    如果您有不明确的重载异常,可能是因为 GetMethod 找到了多个具有该名称的方法。在这种情况下,您可以改用 GetMethods 并使用条件过滤到您想要的方法。这可能有点脆弱,因为有人可能会添加另一个与您的标准足够相似的方法,然后当它返回多个方法时会破坏您的代码:

    var returnResult = 
        typeof(MetaDataUtil)
        .GetMethods().Single( m=> m.Name == "GetColumnsAsGrid" && m.IsGenericMethod 
            && m.GetParameters().Count() == 0 //the overload that takes 0 parameters i.e. SomeMethod()
            && m.GetGenericArguments().Count() == 1 //the overload like SomeMethod<OnlyOneGenericParam>()
        )
        .MakeGenericMethod(new [] { genericTypeParameter })
        .Invoke(someInstance, null);
    

    这并不完美,因为您仍然可能有一些歧义。我只是检查计数,您确实需要遍历 GetParameters 和 GetGenericArguments 并检查每一个以确保它与您想要的签名匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      • 2022-11-23
      • 2016-09-11
      • 2022-11-28
      相关资源
      最近更新 更多