5

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

    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。

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

谢谢你。

4

8 回答 8

7

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

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

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

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

class BooleanSetting : ConfigSetting
{ /* ... 

等等。然后我可能会给他们每个人一个内部构造函数,并使用工厂模式将基类变成派生类的工厂

仅当您的解决方案是真正通用的时才使用泛型List<T>例如,Like可以是任何内容的列表:整数、字符串、数组、字典、函数等等。如果您正在建模的事物具有少量可能的类型,则只需为每种类型制作一个。

于 2010-01-05T17:53:55.323 回答
6

好吧,您希望它应用什么转换?如果您希望该值已经是正确的类型,您可以这样做:

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

请注意,您必须通过object隐式(如此处)或显式转换:

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

为泛型类型提供的转换集有些有限。但如果原始值确实正确,它应该可以工作。

于 2010-01-05T15:52:11.787 回答
2

您需要将返回的字符串转换为T

public ConfigSetting(string heading, string key) {
    this.value = (T)DerivedMethods.configsettings.SettingGroups[heading].Settings[key].RawValue;
}
于 2010-01-05T15:51:43.150 回答
1

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

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

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

于 2010-01-05T15:55:28.743 回答
1

我假设

DerivedMethods.configsettings.SettingGroups[heading].Settings[key].RawValue

是一个字符串。

您不能将字符串分配给,this.value因为类型this.valueT并且可以是任何东西,例如字符串不可分配的类型。

一种解决方案是删除泛型参数并创建value一个字符串,然后提供不同的访问它的方法来解析布尔值、浮点数或任何需要的东西。

public float GetFloatValue {
    get { return float.Parse(this.value); }
}

// etc
于 2010-01-05T15:55:51.563 回答
0

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

this.value = (T)DerivedMethods.configsettings.SettingGroups[heading].Settings[key].RawValue;
于 2010-01-05T15:53:26.540 回答
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 真的只是没有构造函数的值吗?如果您出于某种原因想避免这种情况,您可能可以明确说明并避免对象转换。

于 2010-01-05T15:54:09.900 回答
0

试一试

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

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

于 2010-01-05T15:58:18.393 回答