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++ 中,我会使用特征类来实现这一点,但我认为这在 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# - 如何使用隐式运算符方法获取 "Find Usages"?

Java在默认操作系统图像查看器中打开BufferedImage

php - 如果它们相同,为什么我会得到 "definition differs"?

character-encoding - sqlite3:无法自动识别查询文件的UTF-8编码

php - 在不相关的类之间共享函数

scala - 按位置对 ListBuffer 进行排序

c# - 将 Borland C++ 迁移到 C#

c# - UrlHelper.Action 方法未映射到具有第一个可变参数的正确路由

c# - 如何克服 C# 中缺乏友元的问题?

甲骨文 11g - "DEFAULT ON NULL"?