C#Generic,返回类型有限

时间:2017-08-31 05:12:48

标签: c# generics

在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

如何做到这一点?

1 个答案:

答案 0 :(得分:2)

您的设计似乎会有一些变化。

getValIMyInterface没有任何定义,因此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

还有一些其他解决方案取决于您想要设计的愿景。