是否可以在泛型类的构造函数中使用强类型参数约束

本文关键字:强类型 参数约束 构造函数 泛型类 是否 | 更新日期: 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;
}
您必须将

TModelTMember都放在构造函数的<>中。

public class MyService<TModel, TMember>
{
    public MyService(Expression<Func<TModel, TMember>> member)
    {
    }
}

不能像使用方法那样创建使用不属于类的额外泛型参数的构造函数。