从泛型参数扩展

时间:2015-09-29 18:39:51

标签: c# generics inheritance

让我们假设我写这个课:

public A<T> : T
{
}

基本上,我希望A扩展(继承)T

例如,如果我有这个:

public class B
{
     public string Name { get { return "B"; } }
}

我应该能够完成这样的事情:

B instance = new A<B>();
Console.WriteLine(instance.Name);

无法编译。

如何从泛型参数扩展?

如果无法完成,为什么不可能?

3 个答案:

答案 0 :(得分:1)

你不能这样做,因为即使你可以写一个约束来说“它必须是一个班级”......

// NOT WORKING CODE...
public class B<T> : T where T : class

......无法保证课程没有密封。

这就是编译器说你不能这样做的原因。

你可以做的是创建一个真正的基类并将T约束到该基类并从基类继承......

public class B<T> : BaseType where T : BaseType

示例:

public class BaseClass
{
}

public class A : BaseClass
{
}

public class B<T> : BaseClass where T : class
{
}

用法:

var x = new B<A>();

答案 1 :(得分:0)

你可以让它发挥作用:

if (isset($_POST['prodCode'])) {
    $value = $_POST['prodCode'];
    // save the letter
    $letter = substr($value, 0, 1);
    // get id
    $id = (int) substr($value, 1, strlen($value) - 1);
    // get value with letter and incremented id
    $valueIncremented = $letter . ++$id;
}
// with $_POST['prodCode'] = 'f102' you will get $valueIncremented = 'f103'

虽然class Program { public static void Main() { B instance = new A<B>(); Console.WriteLine(instance.Name); Console.Read(); } } public class A<T> : B where T : B { } public class B { public string Name { get { return "B"; } } } 应该直接从A继承。不确定你的最终目标是什么。

答案 2 :(得分:0)

也许而不是尝试创建一个继承泛型的类,您可以创建一个扩展方法来执行您正在寻找的任务。

B

使用中:

public static void ExtensionTest<T>(this T test)
{
  Console.WriteLine("ExtensionTest");
}