c# - "Forcing"符合通用约束

标签 c# generics constraints

我有课,Target<T>无法更改,具有通用约束。我想从没有约束的泛型类中构建该类的实例。下面演示了我想要做的事情的意图,但我意识到这段代码将无法编译并且 typeof(T).IsClass是运行时检查,通用约束是编译时问题。

public class TargetMaker<T>
{
    public object GetTarget()
    {
        if (typeof(T).IsClass)
        {
            return new Target<T>();
        }
        return default(T);
    }
}

public class Target<T> where T : class
{
    public Target() { }
}

谁能想出一种方法,使我可以在 TargetMaker 中实现我想要的功能,而无需向其添加匹配约束,同时将所有逻辑保留在 TargetMaker 类中?

最佳答案

您介意使用反射吗?如果不是:

if (typeof(T).IsClass)
{
    Type targetType = typeof(Target<>).MakeGenericType(typeof(T));
    return Activator.CreateInstance(targetType);
}
...

如果性能是一个问题,可能有优化它的方法 - 例如通过表达式树构建工厂委托(delegate),并缓存它们。如果性能不是问题,那将会很麻烦:)

关于c# - "Forcing"符合通用约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9044081/

相关文章:

c# - 为什么不能将两个泛型类型与 '==' 进行比较?

MySQL "many to many"关系错误

sql - 在保留原始主键且无需手动更新的情况下交换 MS SQLServer 中的两行

mysql - 使用复合键在 GORM 中对现有数据库关系建模

c# - 如何从Azure Key Vault读取值

c# - WinStore : Slide a Grid on- and off-screen

c# - 无法在 asp.net View 中显示来自数据库的图像

C# - 如何在 IQueryable 对象中搜索 Where Like %

c# - 为什么不允许从 "class A : IX"到通用 "T where T : IX"的转换?

java - 类型参数后面不能有其他边界解决方法