如何实现一个类来访问C#中几种不同类型的对象?

nam*_*ame 4 c# dynamic

我正在尝试以类似于数据库行的方式实现一个类来访问不同类型的项目.

但是,我有两个不同的想法,我不知道选择哪一个:

设计1

public enum ObjectTypeA
{
    Undefined,
    Integer,
    Float
}

public class MyObjectA
{
    private object val;

    public ObjectTypeA Type
    {
        get;
        private set;
    }

    public int Integer
    {
        get
        {
            if (Type != ObjectTypeA.Integer) throw new Exception();
            return (int)val;
        }
        set
        {
            Type = ObjectTypeA.Integer;
            val = value;
        }
    }

    public float Float
    {
        get
        {
            if (Type != ObjectTypeA.Float) throw new Exception();
            return (float)val;
        }
        set
        {
            Type = ObjectTypeA.Float;
            val = value;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 可以减少编译时检查.
  • 不能使用is运算符,GetType()等(重新发明类型系统).
  • 为价值类型装箱和拆箱.
  • 可以由其他类继承(例如,我可以使用继承创建"命名对象").

设计2

public abstract class MyObjectB
{
}

public class MyIntegerB : MyObjectB
{
    public int Value
    {
        get;
        set;
    }

    public MyIntegerB(int _value)
    {
        Value = _value;
    }
}

public class MyFloatB : MyObjectB
{
    public float Value
    {
        get;
        set;
    }

    public MyFloatB(float _value)
    {
        Value = _value;
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 实施更短,更简单.
  • 非常详细(铸造)使用.

性能并不重要,但它仍然很重要,因为大多数要存储的对象都是整数或浮点数,所以拳击开销很重要.

这些类只包含值,而不是依赖于类型的方法等.因此,如果解决方案使用继承,则无关紧要.

重要提示:其中一个要求是可能有两种类型使用相同的基础类型(例如,从MyObjectB派生的两个类可能使用int作为值),因此使用对象或泛型可能是不可能的.

关于使用哪种设计或其他不同设计的任何建议?

编辑: 我不喜欢第二个的原因是因为它使用起来非常冗长:

MyObjectB objB = new MyIntegerB(12);
Console.WriteLine(((MyIntegerB)objB).Value);
Run Code Online (Sandbox Code Playgroud)

因为我不能继承它来创建类似"命名对象"的东西,所以我必须将MyObjectB附加到类中,并且使用更加冗长.

JSB*_*ոգչ 6

我不明白你为什么不在这里使用泛型.更强烈:我不明白为什么你需要这个:好像Nullable<T>将覆盖所有的使用情况非常漂亮.如果没有,通常实现这一点是微不足道的:

public class ValueWrapper<T>
{
    public T Value
    {
        get;
        private set;
    }

    public Type WrappedType
    {
        get { return typeof(T); }
    }
}

public MySpecialInt : ValueWrapper<int>
{
    /* etc */
}
Run Code Online (Sandbox Code Playgroud)