c# - 通用约束

标签 c# generics

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

我的对象.cs

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

        public bool Validate(out ServiceError? message)
        {
            // validation
        }
    }

对象库

public abstract class ObjectBase
{
    public abstract bool Validate(out ServiceError? message);
}

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

ObjectRepo.cs

public void Put<T>(MyObject<T> obj)
  where T : ObjectBase, new()
{
    // code
}

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

最佳答案

如果类中有 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
    }
}

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

更新 2
如果更新 1 不可能,可能值得检查一下是否可以用 ObjectBase 或其他基类替换 T

关于c# - 通用约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43283398/

相关文章:

c# - 找不到该组件。 (来自 HRESULT : 0x88982F50) 的异常

c# - WPF如何更改首先打开的窗口

c# - 防止在松散耦合系统中多次执行操作的策略(使用 Azure 服务总线和云工作人员)

java - 我应该使用问号类型参数还是抑制原始类型警告?

c# - 使用 Vector2 和 Vector2 作为通用约束?

c# - 如果 pendrive 插入 USB 端口,如何使用 c# 检测?

c# - excel xml窗口宽度属性

通用工厂的 Java 通用不编译

java - 显式类型参数

c++ - 数组迭代器中的 hasNext() 方法