c#的多类型变量

本文关键字:类型变量 | 更新日期: 2023-09-27 17:50:17

我这里有一点奇怪的问题。我有一个项目约束,其中属性的值需要是一个数字(int, double, long等都是可接受的),stringdatetime。Value参数需要是这三个参数之一的原因(err..)好吧,如果你计算所有可能的数字值类型,那就更多了)类型是因为根据类型的不同,底层值需要转换为特殊格式,以便序列化到REST API。为了简化事情,这里有一个类作为POCO的基本思想:

class Foo
{
     public string Name {get;set;}
     public Guid Id {get; set;}
     public UNKNOWN Value {get;set;}
}

我考虑过使用泛型来实现这一点,使用where T : struct约束,但这仍然留下了太多的类型,理论上可以设置,实际上是无效的类型。当然,我可以在构造/设置Value参数期间执行类型检查并抛出异常,但这感觉不像"干净"的代码。

我看了一下这个问题,你如何处理一个可以是多种类型的变量?,但它并没有真正起作用,因为它更像是一个处理继承的问题。然而,使用多个可空的私有字段并根据填充哪个字段返回单个属性是可能的,但我再次觉得必须有更好的方法。

我想到的另一种可能性是使用dynamic类型,并执行一些反射魔法来检查底层类型(并执行转换&格式/抛出异常)。我有点担心这会影响性能。

对于这种情况有什么最佳实践吗?如果没有,有没有更好的方法来处理我所提到的?

c#的多类型变量

EDIT Eric Lippert在他的一个关于stackoverflow的回答中教了我这种调度方法,我现在正在寻找它。如果/当我追踪到它时,我会用链接更新这个答案(这个人已经回答了相当多的问题)。另外,OP,你问到了性能,看看Lippert的这个信息:动态变量是如何影响性能的?

我将混合使用动态和特殊情况处理,并使用泛型类型捕获所有未定义(尚未实现)的类型。

class Foo
{
  public dynamic Value { get; set; }
}
class FooHandler
{
  public void Serialize(Foo foo)
  {
    SerializeField(foo.Value);
  }
  void SerializeField(int field)
  {
    Console.WriteLine("handle int");
  }
  void SerializeField<T>(T field)
  {
    throw new NotImplementedException("Serialization not implemented for type: " + typeof(T));
  }
}
class Program
{
  [STAThread]
  static void Main(string[] args)
  {
    Foo f = new Foo();
    f.Value = 1;
    FooHandler handler = new FooHandler();
    handler.Serialize(f);
    Console.ReadKey();
  }
}

然后随意添加类型

您可以使用专用类作为"多类型变量"。在实例化时,你可以传递一个int, double, long等,当你需要获得存储的值时,你可以使用一个单独的调用。

public class Foo
{
    public class Value
    {
        object _value;
                
        public Value(int value) { _value = value; }
        public Value(double value) { _value = value; }
        public Value(long value) { _value = value; }
        // etc
        public object GetValue() { return _value; }
    }
    public void TestCall()
    {
        Value myValue = new Value(123);
        Debug.WriteLine(myValue.GetValue());
    }
}