【问题标题】:c# Type object to Type Paramater [duplicate]c#类型对象到类型参数[重复]
【发布时间】:2013-11-12 19:12:17
【问题描述】:

如何使用 Type 对象作为 Type 参数?

例如:

byte[] Data;
Type objectType;
public T MyFunction<T>()
{
     return OtherClass.Deserialize <objectType> (Data);
}

也就是说,如何在Type参数&lt;typehere&gt;中使用Type对象?

【问题讨论】:

  • 尝试 而不是
  • 我将类型存储在变量@FacioRatio
  • 另见this answer

标签: c# types


【解决方案1】:

您的通用方法需要 类型标识符,这在 编译时 是已知的。同时,您正试图将这种类型的 instance 传递给您的方法,但直到 runtime 才知道这种实例。

改用反射:

var method = typeof (OtherClass).GetMethods()
                                .Single(x => "Deserialize".Equals(x.Name) 
                                              && x.IsGenericMethodDefinition);
method = method.MakeGenericMethod(new[] { objectType });
method.Invoke(null, new object[] { Data });

【讨论】:

  • 你建议怎么做?也许我不清楚,我想真正的问题是如何将对象转换为存储在 Type 变量中的类型?
【解决方案2】:

Generics 真正设计用于处理调用方在编译时已知的类型。 (当然,就调用者而言,类型参数本身可以是类型参数。)

否则,您将无法使用泛型 - 您将获得与 OtherClass.Deserialize 关联的 MethodInfo,使用 objectType 作为参数调用 MakeGenericMethod,然后调用生成的方法。

var method = typeof(OtherClass).GetMethod("Deserialize");
var genericMethod = method.MakeGenericMethod(objectType);
object result = genericMethod.Invoke(null, Data);

请注意,这不会返回 T。如果您实际上不打算使用类型参数,则不清楚为什么您的 MyFunction 方法是通用的。

【讨论】:

    【解决方案3】:

    像这样(递归,为简洁起见):

    Type myType;
    public void MyFunction<T>(T instance) {
      MyFunction<Type>(myType);
    }
    

    【讨论】:

    • 这行不通,我需要返回一个 T 类型,而不是 Type 对象。
    • 你到底想做什么?
    • object 对象中获取 myType 类型的对象,抱歉,这里很难说清楚。
    【解决方案4】:

    这里的myType 是一个Type 对象。所以你应该打电话给MyFunction&lt;Type&gt;( myType);

    【讨论】:

    • 不确定您要做什么?
    【解决方案5】:

    你应该像这样编写 MyFunction 方法:

    public T MyFunction<T>(byte[] data)
    {
         return OtherClass.Deserialize<T>(data);
    }
    

    客户端代码如下所示:

    byte[] Data = new byte[];
    Type objectType;
    objectType = MyFunction<Type>(Data);
    

    【讨论】:

    • 是的,但是结果是一个 Type 对象,这绝对不行,我需要一个 objectType 类型的对象..
    • 啊,我现在明白你在问什么了。泛型不适用于运行时确定的类型,它们旨在提供类型安全,这不是您在运行时确定类型所得到的。尝试提取一些通用接口并与泛型方法一起使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 2016-12-05
    • 2016-01-27
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多