是否可以在泛型类的构造函数中使用强类型参数约束
本文关键字:强类型 参数约束 构造函数 泛型类 是否 | 更新日期: 2023-09-27 18:35:07
我想在 C# 中定义一个泛型类:
public class MyService<TModel>
{
public MyService(/*What to declare here?*/)
{
}
}
这样我就可以像下面这样实例化它:
var service = new MyService<SomeModel>(m => m.SomeField);
其中SomeField
仅限于SomeModel
字段。这可能吗?
我知道我可以为类中的方法声明类似的东西,但不能完全弄清楚如何为构造函数做到这一点。例如,我可以在MyService
中声明以下内容:
public void SomeMethod<TMember>(Expression<Func<TModel, TMember>> member)
{
}
并且能够像这样调用它:
var service = new MyService<SomeModel>();
service.SomeMethod(m => m.SomeField);
如果SomeField
实际上不是SomeModel
字段,编译器会抱怨。
你可以这样做:
public class MyService<TModel>
{
public static MyService<TModel> Create<TMember>(Func<TModel, TMember> member)
{
return new MyServiceImpl<TMember>(member);
}
private class MyServiceImpl<TMember> : MyService<TModel>
{
private Func<TModel, TMember> member;
public MyServiceImpl(Func<TModel, TMember> member)
{
this.member = member;
}
}
}
所以现在我可以这样做:
MyService<Foo> service = MyService<Foo>.Create(m => m.Name);
请注意,我不需要指定成员的类型。
这是我的班级Foo
:
public class Foo
{
public string Name;
}
您必须将
TModel
和TMember
都放在构造函数的<>
中。
public class MyService<TModel, TMember>
{
public MyService(Expression<Func<TModel, TMember>> member)
{
}
}
不能像使用方法那样创建使用不属于类的额外泛型参数的构造函数。