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
是一个公共类,该信息是可用的,可以很容易地解决。这可能会影响你在以下任何情况下(如果不是更多):
- 您使用
System.Object
返回一个非公共的非内部types。- 您将通过公共基本types返回一个非公共的非内部派生types,并访问派生types中不属于基本types的属性。
- 你将返回任何包装在匿名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类
朋友组件