构造函数对泛型参数的要求
本文关键字:参数 泛型 构造函数 | 更新日期: 2023-09-27 17:57:51
看到这个问题,我开始思考如何处理C#中的构造函数需求。
假设我有:
T SomeMethod<T>(string s) : where T : MyInterface
{
return new T(s);
}
我想在T
上设置一个要求,即它可以用字符串构造,但据我所知,构造函数定义不允许作为接口的一部分。有标准的方法来解决这个问题吗?
向接口添加init方法或属性
public interface MyInterface
{
void Init(string s);
string S { get; set; }
}
T SomeMethod<T>(string s) : where T : MyInterface, new()
{
var t = new T();
t.Init(s);
var t = new T
{
S = s
};
return t;
}
由于不能为构造函数约束指定参数,
另一种方法是动态调用构造函数:
// Incomplete code: requires some error handling
T SomeMethod<T>(string s) : where T : MyInterface
{
return (T)Activator.CreateInstance(typeof(T), s);
}
这样做的问题是你失去了类型安全性:如果你试图将其与没有匹配构造函数的MyInterface实现一起使用,它将抛出异常。
如果你想让构造函数接受字符串输入,你需要实现一个抽象类:
public abstract class BaseClass<T>
{
public BaseClass<T>(string input)
{
DoSomething(input);
}
protected abstract void DoSomething(string input);
}
然后,派生类只提供抽象方法的实现,然后它就可以选择它想要的任何接口。
public class Sample<T> : BaseClass<T>, IMyInterface
{
public Sample<T>(string input)
: base(input)
{
}
protected override void DoSomething(string input)
{
}
public void MyInterfaceMethod()
{
}
}