在没有类型实例的情况下打开C#中的类型

本文关键字:类型 情况下 实例 | 更新日期: 2023-09-27 17:57:32

我有一个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

在没有类型实例的情况下打开C#中的类型

类似的东西?

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);
}
相关文章: