我有一些课程,例如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()会更好并且使用更少的强制转换
答案 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()
{
}
<击>
假设A
和B
具有默认构造函数,则不需要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
的类型参数(无论如何都不需要)。此外,您必须将T
和T1
指定为方法的类型参数
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;
}
}