【问题标题】:How to run method that returns an object of "Type" from generic class [duplicate]如何运行从泛型类返回“类型”对象的方法[重复]
【发布时间】:2023-03-18 14:51:01
【问题描述】:

你能帮我解决一个问题吗?我想初始化和使用这样一个类:

public class GenericClass<T>
{
    public static T Method(string xml)
    {
       ...
    }
}

我想做的是:

public void do(Type _type)
{
    var genObj = new GenericClass<_type>();  // Error
    var result = genObj.Method("parameter");
}

我找到了如何初始化 GenericClass here ,但我真的不知道如何运行该实例的方法,该方法返回初始化中使用的类型。

【问题讨论】:

  • 请注意 MakeGenericType 将 _type 绑定为 T 并返回一个 Type “包含”物化泛型类定义。然后,Activator.CreateInstance 可以解决问题,就像任何类型一样。
  • 我想一个后续问题可能是,你想用这个解决方案解决什么问题?
  • 我找到了创建泛型类的方法,但我不确定如何运行方法并从中获取结果。结果应该与我用于创建类的类型相同。
  • _type 具有仅在运行时已知的值。类型参数&lt;T&gt; 在编译时必须是已知的(对于任何具体类型)。因此,您所问的根本不可能,因为它需要在可用之前的信息。
  • 嗨。你为什么在这个问题上设置“重复”?您提供的答案链接无法帮助解决问题。

标签: c# generics reflection typeof


【解决方案1】:

您实际上要问的是如何使用反射创建GenericClass&lt;T&gt; 的动态实例。它是这样工作的:

var genericTypeDefinition = typeof(GenericClass<>);
var concreteType = genericTypeDefinition.MakeGenericType(_type);
var instance = Activator.CreateInstance(concreteType); // Calls default constructor.

如果你想调用一些instance.Method(),你必须将实例转换为更具体的类型(因为CreateInstance 只是返回一个对象)。我建议您定义一个定义此方法的接口,让GenericClass&lt;&gt; 实现此接口,以便您可以在运行时安全地转换为此接口并调用所需的方法:

interface ISomeInterface
{
    object Method(string xml);
}

class GenericClass<T> : ISomeInterface
{
    void object ISomeInterface.Method(string xml)
    {
        return Method(xml);
    }

    public T Method(string xml)
    {
    }
}

然后:

var genericTypeDefinition = typeof(GenericClass<>);
var concreteType = genericTypeDefinition.MakeGenericType(_type);
var instance = (ISomeInterface) Activator.CreateInstance(concreteType); // Calls default constructor.

instance.Method("parameter");

【讨论】:

  • 方法应该返回 T 类型的结果。这是问题的重点。在您的情况下,它也将是通用接口: T Method(string)
  • 是的,我想到了。现在改变了。
猜你喜欢
  • 2015-05-16
  • 1970-01-01
  • 1970-01-01
  • 2016-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
  • 2023-03-12
相关资源
最近更新 更多