2014-01-11 220 views
1

所以,這是交易。我有一個名爲IBehavior的接口。我的每個實體都有一個變量:private IBehavior _behavior。每個實體也有一個變量:public string Behavior。加載我的實體時,字符串是從xml文件填充的。隨後在所有實體上調用名爲init()的函數。此方法接受字符串並使用以下代碼行調用所需的構造函數:Type.GetType(Behavior).GetConstructor(Type.EmptyTypes).Invoke(null);用字符串創建一個對象

不幸的是,Invoke()方法返回Object類型的東西,並且_behavior變量不會在沒有強制轉換的情況下接受它。我試過這種方法: _behavior = (IBehavior)Type.GetType(Behavior).GetConstructor(Type.EmptyTypes).Invoke(null);

所有這些都告訴我,我的_bahavior變量爲空,因此這種情況不會發生。我可能錯誤地使用了GetConstructor()。有人可以請指點我正確的方向嗎?

初始化函數:

public void Init() 
{ 
    if (Behavior == "null" || Behavior == "none") 
    { 
    _behavior = null; 
    return; 
    } 

    _behavior = (IBehavior) Type.GetType(Behavior).GetConstructor(Type.EmptyTypes).Invoke(new object(), null); 
} 
+0

如果需要更多信息,請告訴我您希望看到的內容,然後我將其添加到編輯中。此外,我很抱歉,如果這是一個轉發,但我還沒有發現任何已經解決了我的問題呢。 – user1311199

回答

3

從它的名稱使用創建類型:

_behavior = (IBehavior)Activator.CreateInstance(Type.GetType(Behavior)); 

的另外一個問題你的代碼是因爲你使用MethodBase.Invoke(Object, Object[])方法,你正在呼籲new object()構造:

.GetConstructor(Type.EmptyTypes).Invoke(new object(), null) 

並且通過僅指定arr對象唉,你用ConstructorInfo.Invoke(Object[])方法:

_behavior = (IBehavior)Type.GetType(Behavior) 
          .GetConstructor(Type.EmptyTypes) 
          .Invoke(new object[] { }); 

:如果您收到ArgumentNullExceptionActivator.CreateInstance,請記住,類型必須與命名空間(如果在同一程序中定義)來指定,如:

Activator.CreateInstance(Type.GetType("ConsoleApplication.SomeClass")) 
+0

謝謝。任何想法爲什麼這會導致ArgumentNullException? – user1311199

+0

@ user1311199,也許創建類型的構造函數有一個參數,並且你正在用'Invoke(new object(),null)'傳遞'null'。 –

+0

對不起,我應該說更好,但是我用'Activator.CreateInstance(Type.GetType(Behavior));'和'CreateInstance()'替換了'Invoke(new object(),null)' ArgumentNullException。 – user1311199