【问题标题】:Nested classes and dynamically invocations issues嵌套类和动态调用问题
【发布时间】:2013-03-15 14:50:40
【问题描述】:

我有以下场景:

public class Restriction
{
    public string RestrictionName { get; set; }
    public bool Eval(decimal Value2)
    {
        Type typeRestriction = Type.GetType(RestrictionName);
        return (bool)typeRestriction.InvokeMember("Eval",
            BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static,
            null,
            null,
            new object[] { this, Value2 });
    }


    /* Nested Classes */
    class A
    {
        public static bool Eval(Restriccion r, decimal value)
        {
            // Do something
        }
    }

    class B
    {
        public static bool Eval(Restriccion r, decimal value)
        {
            // Do something
        }
    }
}

当我尝试时:

    Restriction r = new Restriction();
    r.RestrictionName = "A";
    r.Value = 15;
    r.Eval(16);

我得到System.NullReferenceException: Object reference not set to an instance of an object. 调试告诉我typeRestriction 为空。为什么?嵌套类有特殊待遇吗?

【问题讨论】:

    标签: c# reflection nested-class


    【解决方案1】:

    AB 类型在这种情况下是嵌套类型。因此他们的名字分别是Restriction+ARestriction+B。此外,名称中必须包含包含 Restriction 的命名空间。例如,如果命名空间是ConsoleApplication,则需要使用名称ConsoleApplication.Restriction+A 作为A 的名称。

    【讨论】:

    【解决方案2】:

    这是一个命名空间问题,请尝试使用以下方式引用类类型:

    Type typeRestriction = Type.GetType(string.Format("Restriction+{0}", RestrictionName));
    

    【讨论】:

    • 我试过 Restriction+{0}Restriction.{0} 但没用
    • 它只是错过了命名空间。如果要从另一个程序集中使用它,则带有版本号和内容的完全限定程序集名称也必须在字符串中。但幸运的是,这里不是这种情况。
    猜你喜欢
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多