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'",所以我假设我正在做一些非常倒退的事情.
谢谢.
你遇到了问题,因为这不是一个很好的泛型.如果泛型类型参数只能以四种不同的方式构造 - 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>,例如,可以列表什么:整数,字符串,数组,词典,功能,等等.如果你正在建模的东西有少量可能的类型,那么只需为每种类型制作一个.
那么,您希望它适用于哪种转换?如果您希望值已经是正确的类型,您可以这样做:
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)
为泛型类型提供的转换集有些限制.但如果原始值真的正确,它应该有效.
| 归档时间: |
|
| 查看次数: |
5552 次 |
| 最近记录: |