C#中的通用类成员?

时间:2010-01-05 15:49:08

标签: 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;
    }
}

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

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

谢谢。

8 个答案:

答案 0 :(得分:7)

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

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

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

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

class BooleanSetting : ConfigSetting
{ /* ... 

等等。然后我可能会给每个内部构造函数,并使用工厂模式将基类编译为派生类的 factory

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

答案 1 :(得分:6)

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

object tmp = DerivedMethods.configsettings.SettingGroups[heading].Settings[key].RawValue;
this.value = (T) tmp;

请注意,您必须隐式(如此处)或使用显式广告投放object

this.value = (T)(object) DerivedMethods.configsettings... (etc);

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

答案 2 :(得分:2)

您需要将返回的String转换为T

public ConfigSetting(string heading, string key) {
    this.value = (T)DerivedMethods.configsettings.SettingGroups[heading].Settings[key].RawValue;
}

答案 3 :(得分:1)

我认为您不一定要使用泛型来提前规划所有可能的未来场景,因为您将来可能会遇到边缘情况,并且无论如何都必须修改代码。

但是,如果您已经拥有通用适用的多个场景,那么您现在可以从逻辑重用中受益,并且可以正确地测试它们。

我看到其他人已经提供了代码答案,所以我会停在这里。

答案 4 :(得分:1)

我认为

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

答案 5 :(得分:0)

看起来您正在尝试将字符串(configsettings.SettingGroups[heading].Settings[key].RawValue)分配给通用成员。你需要提供一些方法将字符串转换为类型T - 通常通过强制转换。例如:

this.value = (T)DerivedMethods.configsettings.SettingGroups[heading].Settings[key].RawValue;

答案 6 :(得分:0)

在这一行:

this.value = DerivedMethods.configsettings.SettingGroups[heading].Settings[key].RawValue;

您将类型T的变量设置为字符串值。 RawValue方法返回一个字符串。您需要明确地将其强制转换为T。

this.value = (T) (object) DerivedMethods.configsettings.SettingGroups[heading].Settings[key].RawValue;

T真的只是没有构造函数的价值吗?如果你想出于某种原因避免使用对象,你可以明确地避免使用对象

答案 7 :(得分:0)

尝试

string strValue = DerivedMethods.configsettings.SettingGroups[heading].Settings[key].RawValue;
this.value = (T)Convert.ChangeType(strValue, typeof(T), CultureInfo.InvariantCulture)

如果您将配置值存储为字符串并希望将其转换为正确的类型。这仅适用于大多数原始类型,如Int32,Double等。