假设我正在使用泛型函数:
var value = f.Read<f.Type>();
我想写:
object value;
if (f.Type == typeof(bool))
{
value = f.Read<bool>();
}
if (f.Type == typeof(byte))
{
value = f.Read<byte>();
}
...
但这会产生错误:
f是一个变量但是像类型一样使用
我可以写条件:
@Check
但这并不真正有效,因为它很冗长,如果我事先并不知道所有可能的类型,那么可能是不完整的,而value是一个对象而不是类型。
有解决方案吗?
答案 0 :(得分:2)
如果在您创建Foo实例时已知类型(之后不会更改),那么通用接口将是最佳解决方案:
public interface IFoo<T>
{
T Read();
}
public class Foo<T> : IFoo<T>
{
public T Read()
{
Type type = typeof(T);
byte[] buffer = ...get byte array from wherever...;
object boxedResult;
using (MemoryStream ms = new MemoryStream(buffer))
{
using (BinaryReader br = new BinaryReader(ms))
{
if (type == typeof(int))
boxedResult = br.ReadInt32();
else if (type == typeof(long))
boxedResult = br.ReadInt64();
else if (type == typeof(bool))
boxedResult = br.ReadBoolean();
else if (type == typeof(byte))
boxedResult = br.ReadByte();
// ...
// other types you want to process
// ...
else boxedResult = null;
}
}
if (boxedResult != null)
return (T)boxedResult;
else
throw new Exception(string.Format("{0} not supported", type.Name));
}
}
你使用这样的类:
var intFoo = new Foo<int>();
var boolFoo = new Foo<bool>();
int intVal = intFoo.Read();
bool boolVal = boolFoo.Read();
答案 1 :(得分:1)
虽然有多种方法可以解决此问题through reflection或LINQ expressions,但我认为问题的根本原因在于IFoo
界面设计不佳。
如果您只需要读取的object
结果,请将界面更改为:
public interface IFoo {
Type Type {get;}
object Read();
}
这样可以避免在我们需要的地方使用泛型来解决问题。获得object
。