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这一切都取决于您希望将该工作交给谁。有人要出演。问题是,对于派生的的实现者还是调用方来说,应该更容易些。