可以返回不同类型的通用方法

时间:2014-08-08 19:43:01

标签: c# .net generics

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

protected abstract T GetMyValue<T>();

我希望实现类能够做到这样的事情:

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

     return _myResult;
}

我希望调用者指定类型:

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

这可能吗?

3 个答案:

答案 0 :(得分:2)

就像对象扩展一样?

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);
    }
}

答案 1 :(得分:2)

一种选择就是将字段存储为对象。这将导致拳击结构,但没有更显着的变化没有更好的方法。

class Derived : Base
{
     private object o;

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

        return default(T);
     }
}

除非抽象类本身是通用的,而不是特定的方法,否则你不能真正拥有通用字段。当然,这是一项重大的设计变更。一个实现现在只能返回一种类型。像

这样的东西
abstract class BaseClass<T>
{
    protected abstract T GetMyValue();
}

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

    protected override int GetMyValue()
    {
        return i;
    }
}

答案 2 :(得分:0)

您必须以某种方式使该字段具有您想要返回的相同类型。这是一个诀窍:

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

class ValueHolder<T> {
 static T myResult;    
 public static T GetMyValue()
 {
     return myResult;
 }
}

因为这是一个静态类,所以只能有一个这样的值。

如果您希望在实例中为每个类型设置一个值,则需要Dictionary<Type, object>