如何在通用类上实现类型安全的枚举模式?假设它是按以下方式实现的。
然后,一种选择是将其分成两个部分,即 KnownSetting 容器类和 Setting 实现,但是构造函数的范围不能是私有的,以便从容器内部实例化。
如何实现此模式,使其泛型方面对最终用户保密,但仍具有强类型?是否有更合适的模式,或者是否有更好的实现方式?
更新:我添加了第二个示例,以说明我确实希望设置的类型是通用的。
public class KnownSetting<T>
{
public readonly static KnownSetting<String> Name = new KnownSetting<String>("name", "Default Name", t => t);
public readonly static KnownSetting<int> Size = new KnownSetting<String>("size", "25", t => Converter.ToInt32);
public String Key { get; set; }
public T DefaultValue { get; set; }
public Func<String, T> Converter { get; set; }
private KnownSetting(String key, T defaultValue, Func<String, T> converter)
{
Key = key;
DefaultValue = defaultValue;
Converter = converter;
}
}
这种实现方式是正确的,因为构造函数仍然是私有的,但是当使用这种构造时,看起来不太对:
public static class Program
{
public static void main()
{
var x = KnownSetting<?>.Name;
}
}
然后,一种选择是将其分成两个部分,即 KnownSetting 容器类和 Setting 实现,但是构造函数的范围不能是私有的,以便从容器内部实例化。
如何实现此模式,使其泛型方面对最终用户保密,但仍具有强类型?是否有更合适的模式,或者是否有更好的实现方式?
更新:我添加了第二个示例,以说明我确实希望设置的类型是通用的。
T
都有单独的值。你不想要这样。 - SLaksKnownSetting<int>.Name != KnownSetting<String>.Name
没问题,否则您不会想要那个。 - Mike Zboray