2014-04-03 18 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);