可能T <t> </t>

时间:2012-02-02 20:32:17

标签: c#

我有一些课程,例如A,以及其他扩展A (A1,A2)的课程。 A是一个容器 - 它只有字段,任何方法和属性。

另一个类是B<T> where T : A,并且是B (B1, B2)

的扩展

是否可以在c#中执行此操作?

public List<T<T1>> DoSomething(object parameter) 
                                      where T : B<T1>, new() where T1 : A, new()

在该方法中,我必须动态创建T(B1或B2或B3)对象并填充该通用对象动态创建的T1对象(A1,A2,A3)。是的,我可能可以使用Activator,但使用新的T()会更好并且使用更少的强制转换

4 个答案:

答案 0 :(得分:6)

您不需要T<T1>

要清理一下:

public List<T> DoSomething<T, T1>(object parameter) 
      where T : B<T1>, new()   // this specifies T<T1> already
      where T1 : A, new()
{
}

<击> 假设AB具有默认构造函数,则不需要new()约束。

答案 1 :(得分:2)

可以这样做,但使用它会很烦人:

public List<TB> DoSomething<TA, TB>(object parameter)
    where TA : A, new()
    where TB : B<TA>, new()
{ }

var list = DoSomething<A1, B1<A1>>(3);

答案 2 :(得分:1)

是的,但是你不能使用T的类型参数(无论如何都不需要)。此外,您必须将TT1指定为方法的类型参数

public List<T> DoSomething<T, T1>(object parameter)
    where T : B<T1>, new()
    where T1 : A, new()

答案 3 :(得分:1)

如果我知道你在问什么,这是可能的 - 但你不需要List<T<T1>>

public class A {}
public class ADerived : A {}

public class B<Ta> where Ta : A
{
    public Ta a { get; set; }
}
public class BDerived<Ta> : B<Ta> where Ta : ADerived {}

public class Test
{
    public List<Tb> DoSomething<Tb, Ta>(Ta input) 
        where Tb : B<Ta>, new() 
        where Ta : A, new()
    {
        var list = new List<Tb>();

        var b = new Tb();
        b.a = input;

        list.Add(b);

        return list;
    }

    public int testThis()
    {
        var result = DoSomething<BDerived<ADerived>, ADerived>(new ADerived());
        return result.Count;
    }
}