gpt4 book ai didi

c# - 使用泛型实现类型安全的枚举模式

转载 作者:可可西里 更新时间:2023-11-01 09:11:01 26 4
gpt4 key购买 nike

如何在泛型类上实现类型安全的枚举模式?让我们假设它是按照这些思路实现的

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;
}
}

这种模式的实现是正确的,因为构造函数仍然是私有(private)的,但是当使用这个构造时,它看起来是错误的:

public static class Program
{
public static void main()
{
var x = KnownSetting<?>.Name;
}
}

然后一个选项是将它分成两部分,KnownSetting 容器类和 Setting 实现,但是构造函数的范围不能是私有(private)的,以便从容器内实例化。

如何实现这种模式,以便它的泛型方面对最终用户隐藏起来,但仍然是强类型的?是否有更合适的模式,或者是否有更好的实现方式?

更新我添加了第二个示例来说明我确实希望设置的类型是通用的。

最佳答案

在使用另一种类型的基类型中创建一个辅助方法,并创建一个已知的设置类。您需要 Create 方法,因为基本构造函数是 Setting(string, object, Func)。这也是我引入另一个泛型变量(U)的原因:

public class KnownSetting : Setting<object>
{
private KnownSetting(string key, object defaultValue, Func<string, object> converter) : base(key, defaultValue, converter) { }

public readonly static Setting<string> Name = Create<string>("name", "Default Name", t => t);
public readonly static Setting<int> Size = Create<int>("size", 25, t => Convert.ToInt32(t));
}

public class Setting<T>
{
public string Key { get; set; }
public T DefaultValue { get; set; }
public Func<string, T> Converter { get; set; }

protected static Setting<U> Create<U>(string key, U defaultValue, Func<string, U> converter)
{
return new Setting<U>(key, defaultValue, converter);
}

protected Setting(string key, T defaultValue, Func<string, T> converter)
{
Key = key;
DefaultValue = defaultValue;
Converter = converter;
}
}
public static class Program
{
static void Main(string[] args)
{
var x = KnownSetting.Name;
}
}

关于c# - 使用泛型实现类型安全的枚举模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14384151/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com