C#将类型变量表示为类型

时间:2017-07-08 18:43:34

标签: c# generics types

假设我正在使用泛型函数:

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是一个对象而不是类型。

有解决方案吗?

2 个答案:

答案 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 reflectionLINQ expressions,但我认为问题的根本原因在于IFoo界面设计不佳。

如果您只需要读取的object结果,请将界面更改为:

public interface IFoo {
    Type Type {get;}
    object Read();
}

这样可以避免在我们需要的地方使用泛型来解决问题。获得object