我有一个用于保存从配置文件加载的值的类。为了使这个类更容易使用,我已经为一些基本类型设置了许多隐式转换。
我想转换的类型之一是IEnumerable(T)。例如,如果程序员在配置文件中有这样的值
a = "1,2,3,4"
在C#代码中,他可以写
IEnumerable<int> a = Config.a;
理想情况下,我想写的是
public static implicit operator IEnumerable<T>(ConfigurationValue val)
{
string value = val;
string[] parts = value.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
List<T> convertedTypes = new List<T>();
foreach (string part in parts)
{
T converted = Convert.ChangeType(part.Trim(), typeof(T));
convertedTypes.Add(converted);
}
return convertedTypes;
}
但是这给了我T语法未定义的语法错误。有没有办法定义这样的转换或是否有特殊的语法?
另外,对于我在.Net Framework 4.0中使用C#4.0的记录
答案 0 :(得分:8)
但是这给了我T语法未定义的语法错误。有没有办法定义这样的转换,还是有特殊的语法?
您正在尝试声明一个泛型运算符 - 而C#中不支持该运算符。 (我不知道IL是否支持它。)构造函数,属性,事件和终结器也是如此。
基本上,只有方法和类型可以是通用的。
编辑:正如评论中所述,我会写一个通用的方法。用户定义的转换 - 尤其是隐式转换 - 应该谨慎使用 very ,IMO。
答案 1 :(得分:3)
您可以创建扩展方法,而不是通用运算符(这是@Jon所说的不可能):
public static IEnumerable<T> AsEnumerable<T>(this string value)
{
if (String.IsNullOrEmpty(value))
yield break;
var parts = value.Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries);
foreach (string part in parts)
yield return Convert.ChangeType(part.Trim(), typeof(T));
}
并像这样使用它:
IEnumerable<int> a = Config.a.AsEnumerable<int>();
答案 2 :(得分:2)
正如Jon Skeet所说,不支持通用运算符,但你可以改为使用泛型运算符。
public static class ConfigurationExtensions
{
public IEnumerable<T> GetValues<T>(this ConfigurationValue val)
{
string value = val.Value;
string[] parts = value.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
List<T> convertedTypes = new List<T>();
foreach (string part in parts)
{
T converted = (T)Convert.ChangeType(part.Trim(), typeof(T));
convertedTypes.Add(converted);
}
return convertedTypes;
}
}