C#中的通用类成员?

Xen*_*ate 5 c# generics member

嘿,我想我在这里有错误的想法,但我不确定什么是最好的.我想要一个具有成员变量的类,它可以是任何类型,具体取决于当时需要的内容.到目前为止,我有这样的事情:

    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;
    }
}
Run Code Online (Sandbox Code Playgroud)

"this.value"行右侧返回的类型当前是一个字符串.我知道这似乎我不需要使用除字符串类型之外的任何东西,但最终我将扩展构造函数,这样'this.value'可以是字符串,int,float或bool.

无论如何,我的编译器说"不能将'字符串'转换为'T'",所以我假设我正在做一些非常倒退的事情.

谢谢.

Eri*_*ert 7

你遇到了问题,因为这不是一个很好的泛型.如果泛型类型参数只能以四种不同的方式构造 - string,float,bool和int - 那么这不是很通用的.我希望通用的东西可以是任何类型.

如果我有一个只能是四种类型之一的东西,那么我会像这样建模:

abstract class ConfigSetting
{ /* shared code here */  }

class TextSetting : ConfigSetting
{ /* Code here to handle string settings */ }

class BooleanSetting : ConfigSetting
{ /* ... 
Run Code Online (Sandbox Code Playgroud)

等等.我可能会再给予他们每个人的内部构造,使基类成为工厂的派生类,使用工厂模式.

如果您的解决方案是真正通用的,请仅使用泛型.像List<T>,例如,可以列表什么:整数,字符串,数组,词典,功能,等等.如果你正在建模的东西有少量可能的类型,那么只需为每种类型制作一个.


Jon*_*eet 6

那么,您希望它适用于哪种转换?如果您希望值已经是正确的类型,您可以这样做:

object tmp = DerivedMethods.configsettings.SettingGroups[heading].Settings[key].RawValue;
this.value = (T) tmp;
Run Code Online (Sandbox Code Playgroud)

请注意,您必须object隐式(如此处)或使用显式强制转换:

this.value = (T)(object) DerivedMethods.configsettings... (etc);
Run Code Online (Sandbox Code Playgroud)

为泛型类型提供的转换集有些限制.但如果原始值真的正确,它应该有效.