在C#中,我想制作一些专门用于从另一个泛型返回特定类型的泛型。专用泛型的目的是强制只返回一些确切的类型(如double,double [],byte,byte [])。可能最好通过一个例子来解释
var x = new MyGeneric<MyInterfaceDouble>();
double returnVal = x.getVal();
var x = new MyGeneric<MyInterfaceMyClass>();
MyClass returnVal = x.getVal();
所以我尝试了几种方法来实现这一目标,但却无法做到这一点。最新的迭代是:
public interface IMyInterface
{}
public interface IMyInterface<T, U> :IMyInterface
{
U getValue();
}
public class MyInterfaceDouble: IMyInterface<MyInterfaceDouble, double>, IMyInterface
{
public double getValue()
{
return 8.355;
}
}
public class MyGeneric<T> where T : IMyInterface
{}
但我无法访问获取值
var x = new MyGeneric<MyInterfaceDouble>();
double returnVal = x.getVal(); // not available
如何做到这一点?
答案 0 :(得分:2)
您的设计似乎会有一些变化。
getVal
内IMyInterface
没有任何定义,因此MyGeneric<MyInterfaceDouble>
自然无效。
您将继承IMyInterface<T, U>
而不是IMyInterface
:
public class MyGeneric<T> where T : IMyInterface<T, SomeSpecialType>
{}
或强>
更改IMyInterface
定义,使getVal
为常规,返回object
:
public interface IMyInterface
{
object getValue();
}
或强>
将MyGeneric<T>
定义更改为:
public interface IMyInterface
{ }
public interface IMyInterface<T>
{
T getVal();
}
public class MyInterfaceDouble : IMyInterface<double>, IMyInterface
{
public double getVal()
{
return 8.355;
}
}
public class MyGeneric<T> where T : IMyInterface
{
T Obj { get; }
}
并使用如下:
var x = new MyGeneric<MyInterfaceDouble>();
double returnVal = x.Obj.getVal(); // available
还有一些其他解决方案取决于您想要设计的愿景。