我想在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
的字段,编译器会抱怨。
答案 0 :(得分:3)
你可以这样做:
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;
}
答案 1 :(得分:1)
您必须将parfor
和TModel
都放在构造函数的TMember
中。
<>
您不能像使用方法一样创建使用不属于类的额外通用参数的构造函数。