我有一个基本抽象类,它允许实现者返回不同的类型:
protected abstract T GetMyValue<T>();
我希望实现类能够做到这样的事情:
T myResult;
public override T GetMyValue<T>()
{
return _myResult;
}
我希望调用者指定类型:
int i = obj.GetMyValue<int>();
这可能吗?
答案 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>
。