簡體   English   中英

C#中的通用類成員?

[英]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.valueT ,可能是任何東西,如類型,其字符串是不可轉讓。

一種解決方案是刪除泛型參數並將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.

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