Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可以返回不同类型的泛型方法_C#_.net_Generics - Fatal编程技术网

C# 可以返回不同类型的泛型方法

C# 可以返回不同类型的泛型方法,c#,.net,generics,C#,.net,Generics,我有一个基本抽象类,它允许实现者返回不同的类型: protected abstract T GetMyValue<T>(); 受保护的抽象T GetMyValue(); 我希望实现类能够执行以下操作: T myResult; public override T GetMyValue<T>() { return _myResult; } T-myResult; 公共覆盖T GetMyValue() { 返回我的结果; } 我希望调用方指定类型:

我有一个基本抽象类,它允许实现者返回不同的类型:

protected abstract T GetMyValue<T>();
受保护的抽象T GetMyValue();
我希望实现类能够执行以下操作:

T myResult;    
public override T GetMyValue<T>()
{

     return _myResult;
}
T-myResult;
公共覆盖T GetMyValue()
{
返回我的结果;
}
我希望调用方指定类型:

int i = obj.GetMyValue<int>();
int i=obj.GetMyValue();

这可能吗?

像对象扩展一样

public static class ObjectExtension
{
    public static T GetValue<T>(this object obj)
    {
        var converter = TypeDescriptor.GetConverter(typeof(T));

        if (converter == null)
            return default(T);

        return (T)converter.ConvertFrom(obj);
    }
}
公共静态类ObjectExtension
{
公共静态T GetValue(此对象对象对象)
{
var converter=TypeDescriptor.GetConverter(typeof(T));
if(converter==null)
返回默认值(T);
返回(T)转换器。从(obj)转换器;
}
}

您必须以某种方式使字段具有要返回的相同类型。这里有一个技巧:

public override T GetMyValue<T>()
{
     return ValueHolder<T>.GetMyValue();
}

class ValueHolder<T> {
 static T myResult;    
 public static T GetMyValue()
 {
     return myResult;
 }
}
public override T GetMyValue()
{
return ValueHolder.GetMyValue();
}
类别价值持有人{
静态T-myResult;
公共静态T GetMyValue()
{
返回我的结果;
}
}
因为这是一个静态类,所以只能有一个这样的值


如果希望实例中的每个类型都有一个值,则需要一个
字典

一个选项就是将字段存储为对象。这将导致对结构进行装箱,但如果没有更重要的更改,没有更好的方法

class Derived : Base
{
     private object o;

     protected override T GetMyValue<T>()
     {
        if (o is T)
           return (T)o;

        return default(T);
     }
}
派生类:基
{
私人客体o;
受保护的覆盖T GetMyValue()
{
if(o是T)
返回(T)o;
返回默认值(T);
}
}
除非抽象类本身是泛型的,而不是特定的方法,否则不能真正拥有泛型字段。当然,这是一个重大的设计变化。一个实现现在只能返回一种类型。差不多

abstract class BaseClass<T>
{
    protected abstract T GetMyValue();
}

class Derived : Base<int>
{
    private int i;

    protected override int GetMyValue()
    {
        return i;
    }
}
抽象类基类
{
受保护的抽象T GetMyValue();
}
派生类:基
{
私人互联网i;
受保护的覆盖int GetMyValue()
{
返回i;
}
}

是。。。但是您需要提供对T的适当转换。您目前没有任何限制,因此如果我调用
GetMyValue
,会怎么样?对于可以返回的类型有任何限制吗?如果你能说
inti=5
,那就太过分了。您知道编译时或运行时的返回类型吗?继承基类的每个类都有自己的约束集您希望具有方法
GetMyValue
的给定类型能够返回任何类型,还是希望type,
a.GetMyValue
只能返回某些类型和类型,
B.GetMyValue
仅能返回其他不同的类型?这些方法可以返回任何类型,也可以在每个实现者将其限制为2-4种类型的情况下对其进行约束(在这种情况下这不是什么大问题)。我知道如果我更改GetMyValue以返回对象,它会给我想要的,但是我尝试使用泛型,主要是为了性能,而不是太多的类型检查。如果你想在类上使用方法,可能并不完全是你想要的。这个答案恰好与我正在编写的完整扩展方法非常接近。让方法返回对象不是更好吗,这样,每个类就不必担心强制转换,而只需要调用方进行适当的强制转换。@cppNoob这一切都取决于您希望将该工作交给谁。有人要出演。问题是,对于
派生的
的实现者还是调用方来说,应该更容易些。