簡體   English   中英

多類型變量 C#

[英]Multiple Type Variable C#

我這里有一個奇怪的問題。 我有一個項目約束,其中 Property 的值需要是數字( intdoublelong等都可以接受)、 stringdatetime Value 參數需要是這三個之一的原因(錯誤..如果你計算所有可能的數值類型允許它多一點)類型是因為根據類型,基礎值需要轉換為用於序列化到 REST API 的特殊格式。 為了簡化這里的事情,這是該類作為 POCO 的基本思想:

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

我想為此使用泛型,帶有where T : struct約束,但這仍然留下太多理論上可以設置的類型,但實際上是無效類型。 當然,我可以在構造/設置 Value 參數期間執行類型檢查並拋出異常,但這並不像“干凈”的代碼。

我看了一下這個問題How do you work with a variable that can be multitypes? ,但這並沒有真正幫助,因為它更多是處理繼承的問題。 但是,使用多個可為空的私有字段並根據填充的屬性返回單個屬性是可能的,但我再次覺得必須有更好的方法。

我想到的另一種可能性是使用dynamic類型並執行一些反射魔法來檢查底層類型(並執行轉換和格式化/拋出異常)。 不過,我有點擔心這真的會損害性能。

是否有針對這種情況的最佳做法? 如果沒有,有沒有更好的方法來處理我提到的這個問題?

編輯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();
  }
}

然后在閑暇時添加類型。

您可以使用專用類作為“多類型變量”。 在實例化時,您可以傳遞intdoublelong等,當您需要獲取存儲的值時,您可以使用單獨的調用。

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());
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM