仅允许从类继承的类型
本文关键字:继承 类型 | 更新日期: 2023-09-27 18:36:00
我有A类和B类(只是样本)
public class A
{
public long Id { get; set; }
public string Name { get; set; }
}
public class B : A
{
public B(long id,string name)
{
}
}
并想做
var b = new B(100, "myName");
Save(b);
我有一个保存方法,我想只允许从 A 类继承的类型,并且还使用了接受两个参数的构造函数
// I know this will work if my Class B has public B() {},
//but not sure how to restrict to have only the once which accept constructor with two parameters
private void Save<T>(T target) where T : A, new ()
{
//do something
}
C# 类型系统中没有任何内容可以强制实施该约束。可以使用反射 API 在运行时进行验证。
另一种选择是指定工厂:
interface IFactory<T> where T : A {
T Construct(object param1, object param2)
}
class BFactory : IFactory<B> {
public B Construct(object param1, object param2) {
return new B(param1, param2);
}
}
void Save<T>(T target, IFactory<T> tFactory) where T : A {
T newT = tFactory.Construct(a, b);
}
泛
型约束不支持带参数的构造函数。大多数情况下使用工厂或创建函数(例如,在 C# 中是否有带有参数约束的泛型构造函数?),但由于对象是事先创建的,并且您只想过滤允许的对象,因此更安全的方法是实现一个(空)接口并将其用作约束:
public class A
{
public long Id { get; set; }
public string Name { get; set; }
}
public class B : A, IAmB
{
public B(long id,string name)
{
}
}
public interface IAmB{}
这样,约束将是:
private void Save<T>(T target) where T : A, IAmB
{
}