我希望能够做这样的事情:
class A<T1, T2>
{
public void Call(T1 arg1, T2 arg2)
{
B b = new B();
b.DoSomething(arg1); // determine which overload to use based on T1
b.DoSomething(arg2); // and T2
}
}
class B
{
public void DoSomething(int x)
{
// ...
}
public void DoSomething(float x)
{
// ...
}
}
我知道这可以通过 if/else 检查来完成,但这似乎不太优雅,尤其是当我有 20 多种类型可供选择时。
最佳答案
如果你想要类型安全,你能做的最好的可能是:
class A<T1, T2>
{
public void Call<T>(T1 arg1, T2 arg2) where T : IDoSomething<T1>, IDoSomething<T2>, new()
{
T b = new T();
b.DoSomething(arg1);
b.DoSomething(arg2);
}
}
public interface IDoSomething<T>
{
void DoSomething(T arg);
}
public class B : IDoSomething<int>, IDoSomething<float>
{
void IDoSomething<int>.DoSomething(int arg)
{
Console.WriteLine("Got int {0}", arg);
}
void IDoSomething<float>.DoSomething(float arg)
{
Console.WriteLine("Got float {0}", arg);
}
}
你可以像这样使用:
var a = new A<int, float>();
a.Call<B>(1, 4.0f);
关于c# - C# 泛型可以这么酷吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21413660/