c# - 在C#中打开没有类型实例的类型

标签 c# default traits

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

最佳答案

像这样吗

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

关于c# - 在C#中打开没有类型实例的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22930218/

相关文章:

c# - 用于 TCP 流的 STUN 服务器

c# - 更改 boolean 值的默认值

jquery - 如何为特定的 jquery 效果设置默认速度

c++ - 类型特征检查OF CRTP派生,在基类中,问题是未定义的类型

c# - Google Maps.TimeZone.Query LatLng返回的时间偏移不正确

c# - 接口(interface)不接受继承成员(OO问题)

C#定义的类变量类型

java - 启动 Activity 时未找到默认 Activity 错误

rust - 有没有办法将多个派生别名作为一个派生?

swing - Scala Wrapper 类通过扩展 Component 和 SequentialContainer.Wrapper 特征,我对特征有正确的理解吗?