2013-01-01 40 views
2

我想在这样的类模板WPF应用程序创建一个通用的数据类型转换器:创建通用的IValueConverter数据类型转换为字符串

[ValueConversion(typeof(T), typeof(string))] 
class DataTypeConverter<T> : IValueConverter 

来转换数据类型如int,双,字节,USHORT到串,并且反之亦然,并用它在不同的属性类型我的类新的双向绑定,然后简单地通过的这一行代码创建任何类型的:

class ushortTypeConverter : DataTypeConverter<ushort>{} 

,如果在文本框可以显示的验证信息,即是结合在输入错误的情况下。

是否可以编写这样的类模板?

+0

在属性的typeof(T)的占位符(意为变化率T为int,双等)或通用的说法?不幸的是,你不能使用通用属性。有关更多信息,请参阅http://stackoverflow.com/questions/294216/why-does-c-sharp-forbid-generic-attribute-types。 – akton

+0

我想使用它作为泛型参数,但是这行代码:[ValueConversion(typeof(T),typeof(string))]是“[good practice](http://msdn.microsoft.com/en-us /library/system.windows.data.valueconversionattribute.aspx)“并且可以省略。 –

回答

4

不幸的是,你不能在[ValueConversion(typeof(T), typeof(string))]使用通用属性(typeof(T)。更多信息请参见Why does C# forbid generic attribute types?。意译,它是一个编译器简化,以避免什么被认为是个难得的边缘情况。

除此之外,我不能想一下为什么这种方法不起作用的原因,但是,像System.ComponentModel.TypeConverter这样的类可能可以为您完成大部分的转换,而不需要泛型,将其包装在一个简单的转换器中可能会更容易。很多IValueConverters在那里可以做你需要的全部或部分内容,见:

+0

感谢您的评论akton。没有泛型属性的问题的其他部分呢?可能吗? –

+0

我看不到任何即时问题。然而,正如我在我的回答中所展开的,我认为使用TypeConverter可能更简单。 – akton

+0

'Convert'方法的实现可能与'return value.ToString();'''ConvertBack'方法一样简单,因为通用参数不能被分类或约束以使用类似'T.TryParse()'的东西。 –