2013-03-15 1 views
3

У меня есть следующий сценарий:Вложенные классы и динамически Invocations вопросы

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. Debug показывает мне, что typeRestriction равна нулю. Зачем? Имеют ли вложенные классы специальное лечение?

ответ

2

Типы A и B вложенные типы в этом сценарии. Следовательно, их имя составляет Restriction+A и Restriction+B соответственно. Кроме того, в название должно быть включено пространство имен, содержащее Restriction. Например, если пространство имен было ConsoleApplication, вам нужно будет использовать имя ConsoleApplication.Restriction+A как имя для A.

+0

И это [описано здесь] (http://msdn.microsoft.com/en-us/library/w3f99sx1.aspx). –

0

Это вопрос Пространства имен, попробуйте ссылки на типы классов с:

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

Я попробовал 'Restriction + {0}' и 'Restriction. {0}', но он не работал. –

+0

Он пропускает только пространство имен. Если это нужно было использовать из другой сборки, в строке также должно быть указано полное имя сборки с номерами версий и т. Д. Но, к счастью, это не так. –

Смежные вопросы