[英]Generic Class Members in C#?
嘿,我想我在這里有錯誤的想法,但我不確定什么是最好的。 我想要一個具有成員變量的類,它可以是任何類型,具體取決於當時需要的內容。 到目前為止,我有這樣的事情:
public class ConfigSetting<T> {
private T value;
public T GetValue() {
return value;
}
public void ChangeValue() {
}
public ConfigSetting(string heading, string key) {
this.value = DerivedMethods.configsettings.SettingGroups[heading].Settings[key].RawValue;
}
}
“this.value”行右側返回的類型當前是一個字符串。 我知道這似乎我不需要使用除字符串類型之外的任何東西,但最終我將擴展構造函數,這樣'this.value'可以是字符串,int,float或bool。
無論如何,我的編譯器說“不能將'字符串'轉換為'T'”,所以我假設我正在做一些非常倒退的事情。
謝謝。
你遇到了問題,因為這不是一個很好的泛型。 如果泛型類型參數只能以四種不同的方式構造 - string,float,bool和int - 那么這不是很通用的 。 我希望通用的東西可以是任何類型 。
如果我有一個只能是四種類型之一的東西,那么我會像這樣建模:
abstract class ConfigSetting
{ /* shared code here */ }
class TextSetting : ConfigSetting
{ /* Code here to handle string settings */ }
class BooleanSetting : ConfigSetting
{ /* ...
等等。 我可能會再給予他們每個人的內部構造,使基類成為工廠的派生類,使用工廠模式。
如果您的解決方案是真正通用的,請僅使用泛型。 例如,像List<T>
一樣,可以是任何內容的列表:整數,字符串,數組,字典,函數等等。 如果你正在建模的東西有少量可能的類型,那么只需為每種類型制作一個。
那么,您希望它適用於哪種轉換? 如果您希望值已經是正確的類型,您可以這樣做:
object tmp = DerivedMethods.configsettings.SettingGroups[heading].Settings[key].RawValue;
this.value = (T) tmp;
請注意,您必須隱式(如此處)或使用顯式轉換來遍歷object
:
this.value = (T)(object) DerivedMethods.configsettings... (etc);
為泛型類型提供的轉換集有些限制。 但如果原始值真的正確,它應該有效。
您需要將返回的String轉換為T
:
public ConfigSetting(string heading, string key) {
this.value = (T)DerivedMethods.configsettings.SettingGroups[heading].Settings[key].RawValue;
}
我認為你不一定要使用泛型來提前計划所有可能的未來場景,因為你將來可能遇到邊緣情況並且必須修改代碼。
但是,如果您已經有一個泛型適合的多個場景,那么您現在可以從邏輯重用中受益,並且可以正確地測試它們。
我看到其他人已經提供了代碼答案,所以我會在這里停下來。
我認為
DerivedMethods.configsettings.SettingGroups[heading].Settings[key].RawValue
是一個字符串。
你不能指定字符串this.value
因為類型this.value
是T
,可能是任何東西,如類型,其字符串是不可轉讓。
一種解決方案是刪除泛型參數並將value
設為字符串,然后提供不同的訪問方式,根據需要解析bools,float或其他任何內容。
public float GetFloatValue {
get { return float.Parse(this.value); }
}
// etc
看起來你正試圖將一個字符串( configsettings.SettingGroups[heading].Settings[key].RawValue
)分配給泛型成員。 你需要提供一些方法將字符串轉換為類型T - 通常通過強制轉換。 例如:
this.value = (T)DerivedMethods.configsettings.SettingGroups[heading].Settings[key].RawValue;
在這一行:
this.value = DerivedMethods.configsettings.SettingGroups[heading].Settings[key].RawValue;
您將類型T的變量設置為字符串值。 RawValue方法返回一個字符串。 您需要明確地將其強制轉換為類型T.
this.value = (T) (object) DerivedMethods.configsettings.SettingGroups[heading].Settings[key].RawValue;
T真的只是沒有構造函數的價值嗎? 如果由於某種原因想要避免這種情況,您可能能夠明確地避免對象轉換。
試試吧
string strValue = DerivedMethods.configsettings.SettingGroups[heading].Settings[key].RawValue;
this.value = (T)Convert.ChangeType(strValue, typeof(T), CultureInfo.InvariantCulture)
如果您將配置值存儲為字符串並希望將其轉換為正確的類型。 這僅適用於大多數原始類型,如Int32,Double等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.