dynamic不包含项目引用的属性的定义

我收到一个错误,说:

'object'不包含'Title'的定义

所有的代码也在github上

我有一个ConsoleApplication1,看起来像这样

namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Movie m = new Movie(); var o = new { Title = "Ghostbusters", Rating = "PG" }; Console.WriteLine(m.PrintMovie(o)); } } } 

Movie.cs

 public class Movie : DynamicObject { public string PrintMovie(dynamic o) { return string.Format("Title={0} Rating={1}", o.Title, o.Rating); } } 

它从SAME项目工作正常,但如果我添加ConsoleApplication1引用ConsoleApplication1并添加完全相同的代码

 namespace ConsoleApplication2 { class Program { static void Main(string[] args) { Movie m = new Movie(); var o = new { Title = "Ghostbusters", Rating = "PG" }; Console.WriteLine(m.PrintMovie(o)); } } } 

我收到一个错误:

'object'不包含'Title'的定义**

即使它是在dynamic的对象。

  • o.Title'o.Title'抛出了一个types为'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException'的dynamic{Microsoft.CSharp.RuntimeBinder.RuntimeBinderException}

这里是一个屏幕截图: 在这里输入图像说明

我正在做这样的事情,并试图从testing项目调用电影function。

您需要使用ExpandoObject

  dynamic o = new ExpandoObject(); o.Title = "Ghostbusters"; o.Rating = "PG"; Console.WriteLine(m.PrintMovie(o)); 

Jahamal的答案并不是说为什么你会得到这个错误。 原因是匿名类是程序集internal的。 关键字dynamic不允许您绕过会员的知名度。

解决方法是用名称public classreplace匿名类。

这是另一个很好的例子,解释原因和另一个可能的解决scheme

调用data2.Person失败的原因是data2的types信息在运行时不可用。 它不可用的原因是因为匿名types不公开。 当方法返回一个匿名types的实例时,它返回一个System.Objec t,它引用一个匿名types的实例 – 这个types的信息对主程序是不可用的。 dynamic运行时会尝试在对象上查找名为Person的属性,但无法从其具有的types信息中parsing该属性。 因此,它会抛出一个exception。 对data.Name的调用工作正常,因为Person是一个公共类,该信息是可用的,可以很容易地解决。

这可能会影响你在以下任何情况下(如果不是更多):

  1. 您使用System.Object返回一个非公共的非内部types。
  2. 您将通过公共基本types返回一个非公共的非内部派生types,并访问派生types中不属于基本types的属性。
  3. 你将返回任何包装在匿名types中的任何东西。

在我的情况下,我有一个unit testing项目,我在Visual Studio上创build和很多情况下,我需要在数据层库上testing方法。 我不想改变所有这些,所以我用以下方法将testing组件标记为朋友:

[组件:InternalsVisibleTo( “MyDataLayerAssemblyName”)]

这解决了它。

例:

 using System.Runtime.CompilerServices; using Microsoft.VisualStudio.TestTools.UnitTesting; [assembly: InternalsVisibleTo( "MyDataLayerAssembly" )] namespace MyUnitTestProject.DataTests { [TestClass] public class ContactTests { ... 

参考: InternalsVisibleToAttribute类

朋友组件