通用约束

jle*_*lee 2 c# generics

我有一个类,我想在创建时强制执行一些通用约束

Myobject.cs

    public class MyObject<T> where T : ObjectBase, new()
    {
        public MyObject()
        {
        }

        public bool Validate(out ServiceError? message)
        {
            // validation
        }
    }
Run Code Online (Sandbox Code Playgroud)

ObjectBase.cs

public abstract class ObjectBase
{
    public abstract bool Validate(out ServiceError? message);
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否有任何方法可以避免每次有这样的函数时都必须为T设置通用约束:

ObjectRepo.cs

public void Put<T>(MyObject<T> obj)
  where T : ObjectBase, new()
{
    // code
}
Run Code Online (Sandbox Code Playgroud)

如果在MyObject类中指定了T的约束,我是否有必要在每次使用MyObject作为参数时重新指定?

Geo*_*vos 6

如果您在课程中有T,请不要在您的方法上重新定义T.

public class MyObject<T> where T : ObjectBase, new()
{
    //public void Put<T>(MyObject<T> obj)//doesn't work
    public void Put(MyObject<T> obj)//works
    {
        // code
    }
}
Run Code Online (Sandbox Code Playgroud)

更新
如果Put在另一个类中是您最好的解决方案,它可以重构您的代码并在同一个类中移动所有T相关的方法(并在类上添加约束)

更新2
如果无法更新1,则可能值得检查是否可以用ObjectBase或其他基类替换T.