首页 > 解决方案 > 创建一个接受类型并返回该类型实例的泛型方法

问题描述

我想将 Type 传递给一个方法,并让该方法创建并返回该类型的新变量。我需要用它的默认值来实例化新变量,而不是传回一个空值。在该方法中,我需要将该实例保存在对象列表中(为清楚起见未显示)。我下面的代码运行,但我得到一个 null 作为返回值。我期望该类型的实例化实例不为空。我将对多种类型(字符串、双精度、列表等)使用此方法。我希望有一种灵活的方法来做到这一点,而不是每次我需要一种新类型时都对新类型进行硬编码。

我确实在这里看到了这个答案。这看起来可行,但仅适用于一种类型(IPerson):

public string InstantiateType<T>(string firstName, string lastName) 
          where T : IPerson, new()

在问题的示例中。我希望有一个更通用的解决方案适用于多种类型 - 字符串、双精度、列表等。传递给该方法的任何内容。

我开始:

public static T DoSomeStuff<T>(string name)
    {
        T newVar = default;
        //Do some stuff with newVar
        return newVar;
    }

我试过(并得到空值):

    public static T DoSomeStuff<T>(string name) where T : List<string>
    {
        T newVar = default;
        //Do some stuff with newVar
        return newVar;
    }

我今天早些时候创建了一个问题,该问题很快作为重复而关闭。我确实找到了这个似乎有效的答案。也许这就是我的答案?

public static T DoSomeStuff<T>(string name)
{
    T newVar = Activator.CreateInstance<T>();
    return newVar;
}

标签: c#types

解决方案


我从...开始default(T)

C# 中的default关键字的行为因所讨论的类型而异。值类型将使用它们的默认值(这可能是预期的行为);但是,引用类型的默认值为null,这不是预期的行为。

我试过(并得到空值)......

再一次,当是引用类型时default不会返回类型的实例。TT

我确实找到了这个似乎有效的答案。也许这就是我的答案?

你是对的。Activator.CreateInstance()是创建任意类型实例的最简单方法。值得注意的是,该类型必须具有无参数构造函数(例如new MyClass()),或者您必须为有效构造函数提供参数。

要强制Activator.CreateInstance()要求无参数构造函数,您可以限制Tnew()

public static T DoSomeStuff<T>(string name) where T : new()
{
    T newVar = Activator.CreateInstance<T>();
    return newVar;
}

推荐阅读