簡體   English   中英

“存儲”一個類型參數供以后在C#中使用?

[英]“Store” a type parameter for later use in C#?

我正在應用程序中創建一個Settings對象,用於存儲用戶定義的設置等。 我計划在我的設置字段中使用各種數據類型(int,字符串,枚舉,任何可序列化的東西)。

如果可能的話,我還想使用一種類型安全的方式來設置任何設置。 我建議的方法將執行以下操作:

Tuple<string, Type> SettingName = new Tuple<string, Type>("NumberOfFoos",
                                                          typeof(**TYPE**));
public void Set(Tuple<string, Type> key, **TYPE** value) { /* Stuff */ }

元組實際上是用戶將值推入的“設置”,並且將由該設置的鍵以及該設置的類型組成。 我想知道的是,是否有任何方法可以讓編譯器強制執行以下操作:在Set()方法中, value的類型與保存在傳遞給Set()的元組中的類型對象的類型相同? 我提出的方法是否可行? 謝謝!

編輯:我想到了一些我應該澄清的事情。

1)這打算是一個靜態類,所以我將無法序列化整個類,只能序列化其中的成員。 因此,我真的很想不必處理每個字段的序列化。 我打算將所有設置值存儲在Dictionary<string, **TYPE**>並對其進行序列化。

2) Tuple定義是恆定的和靜態的。 我實際上將它們更多地視為typedef類型的東西(我確實應該創建自己的SettingKey結構),用戶將其傳遞給Set來指示它們正在更改的字段。 Type參數用於強制value參數為指定類型。

就像是

public void Set<T>(Tuple<string,T> key, T value) { /* stuff */ }

可能會做到

最好刪除元組,並使用通用方法:

public void Set<T>(string key, T value);

這樣,您可以在編譯時指定類型

Set<string>("MyStringKey", "foo");
Set<int>("MyIntKey", 1);

或編譯器可以為您推斷:

Set("MyStringKey", "foo");
Set("MyIntKey", 1);

Set ,可以使用typeof(T)來獲取要傳遞的Type對象。

為什么不簡單地將強類型屬性添加到您的設置對象? 例如public int NumberOfFoos {get {} set {...}}並在getter和setter中調用您的通用序列化和反序列化代碼。

如果這樣做,您的設置對象將無法公開其內部工作方式,並且您將獲得全面的智能感知支持。

好吧,如果您執行了諸如Set<T>(Tuple<string, T>, T value)類的操作,則將獲得設置所需的內容。 而且我認為編譯器可以在使用時推斷Set<T>()中的Set<T>() ,因此您必須編寫它。

但是,您的Get<T>() ,您必須指定期望返回的類型。

public class Foo
{
  Tuple<string, Type> SettingName = new Tuple<string, Type>("NumberOfFoos",
                                                          typeof(**TYPE**));
  public void Set(Tuple<string, Type> key, object value) 
  {
    if(value.GetType() != SettingsName.Value)
      throw new ArgumentException("value");
  }
}

不過,最好像其他答案一樣使用泛型。

我認為您根本不需要處理Type 這樣的東西夠好嗎?

class Settings {
  public static int Foo { 
    get { return (int)_map["Foo"]; }
    set { _map["Foo"] = value; }
  }
  public static string Bar {
    get { return (string)_map["Foo"]; }
    set { _map["Foo"] = value; }
  }
  // ...
  private static Dictionary<string, object> _map = 
    new Dictionary<string, object>();
}

然后,您將序列化字典。 您甚至可以使用一些代碼生成來創建此類。

暫無
暫無

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

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