首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用反射来分析C#中特殊类型的约束?

如何使用反射来分析C#中特殊类型的约束?
EN

Stack Overflow用户
提问于 2015-11-18 00:32:41
回答 1查看 44关注 0票数 2

请参考以下代码:

代码语言:javascript
复制
public class GenericTest2
{

    public class MyGenericClass<T, U, V, W>
        where T : class
        where U : new()
        where V : struct
        where W : System.IO.StringWriter
    {
    }

    public static void Test()
    {
        Assembly a = Assembly.GetAssembly(typeof(GenericTest));
        foreach (Type t in a.GetTypes()) {
            Console.Out.WriteLine(t.FullName);
            if (t.IsGenericType) {
                Console.Out.WriteLine("\tIsGeneric!");
                foreach (Type parm in t.GetGenericArguments()) {
                    Console.Out.WriteLine("\tGeneric parameter: " + parm.Name);
                    Type[] constraints = parm.GetGenericParameterConstraints();
                    for (int i = 0; i < constraints.Length; i++) {
                        Console.Out.WriteLine("\t\t constraint " + i + ": name = " + constraints[i].Name);
                        Console.Out.WriteLine("\t\t constraint " + i + ": fullname = " + constraints[i].FullName);
                    }
                }
            }
        }

    }

}

这段代码将输出如下所示:

代码语言:javascript
复制
ProcessCSharpAssemblies.Program
ProcessCSharpAssemblies.GenericTest2
ProcessCSharpAssemblies.GenericTest2+MyGenericClass`4
    IsGeneric!
    Generic parameter: T
    Generic parameter: U
    Generic parameter: V
        constraint 0: name = ValueType
        constraint 0: fullname = System.ValueType
    Generic parameter: W
        constraint 0: name = StringWriter
        constraint 0: fullname = System.IO.StringWriter

约束classnew()似乎未由parm.GetGenericParameterConstraints()返回。尽管存在对TU的约束,但parm.GetGenericParameterConstraints()并不返回数据。

问:如何使用反射检查这些类型的约束?

EN

回答 1

Stack Overflow用户

发布于 2015-11-18 00:44:59

您正在寻找的约束可以通过查看TypeGenericParameterAttributes来找到。

代码语言:javascript
复制
var gpa = parm.GenericParameterAttributes;

var constraints = gpa & GenericParameterAttributes.SpecialConstraintMask;

if ((constraints & GenericParameterAttributes.DefaultConstructorConstraint) != 0)
{
    // yippie!
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33762226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档