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'”,所以我假设我正在做一些非常倒退的事情。
谢谢。
答案 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等。