2011-03-29 62 views
1

我有2種稱爲EffectEffectMethods這是靜態類我打電話的方法:使用反射調用靜態方法時出現錯誤的返回值?

public class EffectMethods 
{ 
    public static EffectResult Blend (Effect effect) 
    { 
     bool success = true; 
     return new EffectResult (effect.Type, success); 
    } 
} 

我發現使用正確的方法:

Type.GetMethods (BindingFlags.Public | BindingFlags.Static); 

,並篩選出正確的。

但是,當我把它叫做:

(EffectResult) method.Invoke (null, new object [ ] { this }); 
public class Effect 
{ 
    public EffectResult Apply() 
    { 
     var methods = Type.GetMethods (BindingFlags.Public | BindingFlags.Static); 
     var method = methods.First (...); 

     // This result value is now different (success = false) 
     return (EffectResult) method.Invoke (null, new object [ ] { this }); 
    } 
} 

我得到錯誤的結果。這裏thisEffect的當前實例,因爲它是包含反射調用的類型。

基本上我計算的一個值是一個標誌,返回操作是否成功。但是這個值在代碼中被設置爲true,但是在方法通過反射返回後,結果是不同的。

我這樣做不對嗎?有什麼我失蹤?我可以清楚地看到該方法中的值是真實的,但在呼叫站點上,它顯示的方式不同。

+0

你能提供Blend()方法的代碼嗎? – Adi 2011-03-29 21:17:48

+0

也許添加一些更完整的代碼。我仍然沒有看到你如何在靜態方法中得到'this'。 – 2011-03-29 21:19:21

+0

我添加了Blend的代碼,這就是它現在的樣子,因爲我正在像這樣調試它。 Type.GetMethods和method.Invoke,它們在Effect實例類中,通過反射調用Blend方法。 – 2011-03-29 21:21:40

回答

2

我不明白爲什麼它應該返回「壞值」。你沒有提供完整的代碼,所以我只能給你我兩個猜測。

  1. EffectResult構造函數,你忘了給success參數設置爲一個屬性或屬性的實現是錯誤的。

  2. 您用來從EffectMethods獲取方法的Type或者您的AppDomain中具有不同實現的重複程序集。檢查加載的模塊。

+0

你說得對#1,只是檢查,它是真實的。不能相信我錯過了這一點。非常感謝幫助我。 – 2011-03-29 21:38:41

+2

它發生了:-)即使是最小的錯誤,我們時常咬我們。 – 2011-03-29 21:40:05

+2

是的,我知道,但當它發生在我身上時,它就會討厭它:O – 2011-03-29 21:44:34

1

你能再發表更多代碼?我猜根據你所展示的代碼的一些定義。使用我的猜測定義我沒有問題,當然我假設只有一個公共靜態方法和一些基本定義等。

雖然,對於那些類或骨架,看看您的實際代碼會更有幫助。使用這些雖然,它的作品。

using System; 
using System.Reflection; 

public enum EffectType 
{ 
    A, 
    B 
} 

public class Effect 
{ 
    public EffectType Type { get; set; } 
} 

public class EffectResult 
{ 
    public EffectType Type { get; set; } 
    public bool Success { get; set; } 

    public EffectResult(EffectType type, bool success) 
    { 
     Type = type; 
     Success = success; 
    } 
} 

public class EffectMethods 
{ 
    public static EffectResult Blend(Effect effect) 
    { 
     bool success = true; 
     return new EffectResult(effect.Type, success); 
    } 
} 

public static class Program 
{ 
    public static void Main() 
    { 
     var methods = typeof (EffectMethods).GetMethods(BindingFlags.Public | BindingFlags.Static); 

     var result = methods[0].Invoke(null, new object[] { new Effect { Type = EffectType.A } }); 

     Console.WriteLine(result); 
    } 
} 
相關問題