c# - 创建一个接受类型并返回该类型实例的泛型方法
问题描述
我想将 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;
}
解决方案
我从...开始
default(T)
C# 中的default
关键字的行为因所讨论的类型而异。值类型将使用它们的默认值(这可能是预期的行为);但是,引用类型的默认值为null
,这不是预期的行为。
我试过(并得到空值)......
再一次,当是引用类型时default
不会返回类型的实例。T
T
我确实找到了这个似乎有效的答案。也许这就是我的答案?
你是对的。Activator.CreateInstance()
是创建任意类型实例的最简单方法。值得注意的是,该类型必须具有无参数构造函数(例如new MyClass()
),或者您必须为有效构造函数提供参数。
要强制Activator.CreateInstance()
要求无参数构造函数,您可以限制T
为new()
:
public static T DoSomeStuff<T>(string name) where T : new()
{
T newVar = Activator.CreateInstance<T>();
return newVar;
}
推荐阅读
- azure - Azure SQL 数据库复制命令导致源 Azure 应用程序运行缓慢
- python - 来自csv文件的日期,我如何绘制它
- domain-driven-design - 没有共享事件库的微服务之间基于事件的通信?
- security - 安全地允许 Google App Engine 访问 Google Apps 脚本的内部公司网络/服务器
- for-loop - 检查元组中的元组中的元素
- firebase - 当用户失去连接时,firebase onDisconnect() 不会被触发
- python-3.x - n 的 int(n) 是什么意思?
- c++ - 如何在 cmake 工具链文件中为已知的自定义编译器设置编译功能以使用 target_compile_features
- makefile - 具有多个输出规则的 Makefile 在并行运行时不会重建嵌套依赖项
- ruby - 如何在 Mac 上使用 Ruby 在 Selenium 中全选