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