2014-04-03 15 views
0

該問題似乎與傳遞給方法的Expando對象有關。如果我傳入ExpandoObject,則應自動生成的編譯器服務信息爲空。如果您在方法中不使用ExpandoObject,則信息傳遞得很好。編譯器服務使用ExpandoObject時缺少信息

我創建了一個簡單的測試案例:

public class TestClass 
    { 
     public void TestWithClass(object SomeClass, [CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0) 
     { 
      Console.WriteLine(memberName); // Compiler Services information prints out just fine. 
     } 

     public void TestWithExpando(ExpandoObject xPando, [CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0) 
     { 
      Console.WriteLine(memberName); // Compiler Services information is blank 
     } 

     public void RunTest() 
     { 
      //This test case works fine. 
      var jnk = new Junk {Test = "TEST DATA"}; 
      TestWithClass(jnk); 


      //This test case fails to print the Compiler Services information. 
      dynamic xp = new ExpandoObject(); 
      xp.Test = "TEST DATA"; 

      TestWithExpando(xp); 
     } 

     public class Junk 
     { 
      public string Test { get; set; } 
     } 
    } 

回答

1

編譯服務信息是由編譯器完成的,這個問題是不是ExpandoObject,它的dynamic關鍵字,因爲你正在推遲調用,因此它是由處理DLR不是編譯器。鑄造到object首先會解決這個問題。

TestWithExpando((object)xp);