类型参数的约束,可以有一个可选的类型

本文关键字:类型 有一个 类型参数 约束 | 更新日期: 2023-09-27 18:08:53

我一直在这里阅读文档,但我无法得到我可以实现我需要的东西-类型参数约束的某种过载。我"技术上"不知道如何称呼它,所以我提到了"过载"。下面是我想要实现的一个例子:

class Test<T> {
  private Test(string x) {
  }  
  public static Test<T> OpTest(T t) {
    return new Test<T>("test string") {
      Value = t,
    }
  }
  public T Value1 {get;set;}
  public string X {get;set;}
}
// Sample usage
var result = Test<SomeClass>.OpTest(instanceOfSomeClass);

这是我想要的…

//... that I can do this
var result = Test<SomeClass>.OpTest(instanceOfSomeClass);
//and also sometimes this
var anotherResult = Test<SomeClass, SomeOtherClass>
    .OpTest(instanceOfSomeClass, instanceOfSomeOtherClass);

我可以通过创建另一个具有不同约束的类来实现这一点,像这样:

class Test<T, U> : Test<T> {
  private Test(string x):base(x) { }
  public static Test<T, U> OpTest(T t, U u) {
    return new Test<T, U>("test string") {
      Value1 = T,
      Value2 = U,
    }
  }
  public U Value2 {get;set;}
}

虽然这是我想要的工作方式,我觉得有些不对劲。是吗?还是有更好的方法?此外,我只是不觉得这是错误的,但我现在必须复制(复制+粘贴)Test<T>Test<T,U>之间的一些逻辑。

类型参数的约束,可以有一个可选的类型

DRY方式:

class Test<T> {
  private Test(string x) {
  }  
  public static Test<T> OpTest(T t) {
    return new Test<T>("test string") {
      Value1 = t,
    }
  }
  public T Value1 {get;set;}
  public string X {get;set;}
}
class TestExtra<T, U> : Test<T> {
  private TestExtra(string x) : base(x) {
  }  
  public static TestExtra<T, U> OpTestExtra(T t, U u) {
    return new Test<T>("test string") {
      Value1 = t,
      Value2 = u
    }
  }
  public U Value2 {get;set;}
}

var result = Test<SomeClass>.OpTest(instanceOfSomeClass);
var anotherResult = TestExtra<SomeClass, SomeOtherClass>
    .OpTestExtra(instanceOfSomeClass, instanceOfSomeOtherClass);
相关文章: