[英]Is it possible to have strongly typed parameter constraints in a constructor of a generic class?
我想在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)
{
}
}
您不能創建使用不屬於類的多余泛型參數的構造函數,就像使用方法一樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.