我有一个WPF UserControl的通用基类。其中一个依赖项属性定义为
public static readonly DependencyProperty ValueProperty =
DependencyProperty.Register
( "Value"
, typeof(T)
, typeof(ValidatingTextBox<T,C>)
, new FrameworkPropertyMetadata(default(T), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)
);
我写default(T)
作为默认值,我意识到我真正想要的是不同的东西。对于引用类型,default(T)
为null,这不是我想要的特殊情况。如果可能的话,我想构建一个自定义default
运算符,这样我就可以返回自己的默认值。这可能吗?
例如我想象
public static T MyDefault<T>(){
switch(typeof(T)){
case (typeof(String)) : return "";
case (typeof(Foo)) : return new Foo();
}
}
显然上面的内容不会因为很多原因而编译,但意图应该是明确的。有没有办法做到这一点?
在C ++中我会使用traits类来获取它,但我不认为在C#中是可行的。在C ++中,我最终会做类似的事情。
DefaultGenerator<T>.Default
答案 0 :(得分:3)
这样的东西?
private static Dictionary<Type,Func<object>> factory = new Dictionary<Type,Func<object>>{
{typeof(string), ()=> String.Empty },
{typeof(MyClass), ()=> new MyClass() },
};
public static T MyDefault<T>()
{
Type t = typeof(T);
Func<object> func = null;
if(factory.TryGetValue(t, out func))
return (T)func();
else
return default(T);
}