c# - 如何将类型传递给方法 - 类型参数与泛型

标签 c# generics parameters types factory

我有一个类似于工厂的对象的方法。你给它一个类型,它创建一个实例并做一些其他的事情。一种优雅的方式(在我看来)是这样的:

public T MagicMethod<T>() where T: SomeBaseClass
{
    // Magic goes here
}

但这让 FxCop 感到不安,他说这是一种糟糕的风格 - 我收到“CA1004:通用方法应提供类型参数”警告。关于不使用推理之类的东西。所以,我能想到的唯一其他方法是这样的:

public SomeBaseClass MagicMethod(Type T)
{
    // Same magic goes here
}

我相信这在很多帐户上都不如第一种方法,但样式规则......关于警告的 MSDN 文章甚至说没有理由禁止它。

我到底通过抑制这个警告来做对吗?

最佳答案

我相信您误解了 FxCop 告诉您的内容,可能是因为其措辞不够理想。它的意思是泛型方法应该提供一个属于该类型的参数,而不是泛型方法应该有一个非泛型重载来提供运行时类型实例。例如,

public void DoSomething<T>(T myParam);

myParam 是它所指的参数类型。正如您所建议的,它想要这样做的原因是为了推理。这使您可以执行类似...

string foo = "bar";

DoSomething(foo);

不用写

DoSomething<string>(foo);

在您的情况下,可以取消警告,因为您希望用户明确指定类型。但是,我建议(假设您的构造函数是无参数的)将 where 更改为 where T : SomeBaseClass, new()。这意味着它将指示编译器要求传入的任何类型都具有无参数构造函数。这也意味着您可以在代码中执行 new T()

关于c# - 如何将类型传递给方法 - 类型参数与泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1212183/

相关文章:

c# - 在本地机器上设置数据库备份文件

c# - 如果索引高于c#中的字符串,什么类似于java的子字符串?

c# - VerifyHash 似乎在 Windows 上工作,但在 Linux 上失败

java - 为什么HashMap实例的类类型与HashMap.class相等?

azure - 有没有办法在部署到azure(CD)过程中从CI Build的arm模板文件中提取功能应用程序名称

java - Java 中的参数传递(ArrayList 与 Integer)

c# - 使用 C# 的线程池问题

c - 普通 C 中类型安全的通用数据结构?

C# 转换继承的通用接口(interface)

PHP迭代给定月份和年份的月份天数