2013-03-15 85 views
3

我有以下情形:嵌套类和动态调用问题

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为空。为什么?嵌套类有特殊待遇吗?

回答

2

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

+0

这是[记录在这里](http://msdn.microsoft.com/en-us/library/w3f99sx1.aspx)。 – 2013-03-15 15:21:41

0

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

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

我试过'限制+ {0}'和'限制。{0}'但它没有工作 – 2013-03-15 14:59:59

+0

它只会错过命名空间。如果这是从另一个程序集使用的,那么带有版本号和东西的标准程序集名称也必须位于字符串中。但幸运的是,这并非如此。 – 2013-03-15 15:18:19