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

eiu*_*165 81 .net c# dynamic dynamicobject

我收到的错误是:

'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));
        }
    }
} 
Run Code Online (Sandbox Code Playgroud)

Movie.cs

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

它可以在SAME项目中正常工作,但如果我添加ConsoleApplication2并引用ConsoleApplication1并添加Exact相同的代码

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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

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

即使它在动态对象中.

  • o.Title'o.Title'抛出了类型'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException'的异常动态{Microsoft.CSharp.RuntimeBinder.RuntimeBinderException}

这是一个屏幕截图: 在此输入图像描述

我正在做这样的事情并尝试从测试项目调用电影功能.

Rob*_*žan 126

Jahamal的回答没有说​​明为什么你会得到这个错误.原因是匿名类是internal汇编.关键字dynamic不允许您绕过会员可见性.

解决方案是用命名的public class替换匿名类.

这是解释原因和另一种可能解决方案的另一个好例子.

调用data2.Person失败的原因是类型信息data2在运行时不可用.它不可用的原因是因为匿名类型不公开.当该方法返回该匿名类型的实例时,它返回一个System.Objec引用匿名类型实例的t - 一个类型的信息不可用于主程序.动态运行时尝试查找Person在对象上调用的属性,但无法从其具有的类型信息中解析它.因此,它会引发异常.data.Name从那以后工作的呼叫Person是公共课,该信息可用并且可以很容易地解决.

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

  1. 您正在使用返回非公共非内部类型System.Object.
  2. 您将通过公共基类型返回非公共的非内部派生类型,并访问不在基类型中的派生类型的属性.
  3. 您将从不同的程序集返回包含在匿名类型中的任何内容.

  • 这就是为什么OP正在做的是一个问题的真正答案. (2认同)

Jam*_*SOF 73

您需要使用ExpandoObject

 dynamic o = new ExpandoObject();
 o.Title = "Ghostbusters";
 o.Rating = "PG";

 Console.WriteLine(m.PrintMovie(o));
Run Code Online (Sandbox Code Playgroud)

  • 他经历了很多麻烦来写一个精心设计的问题,让他知道他为什么会得到这个错误会很好,正如罗伯特建议的那样. (26认同)
  • 似乎你不能使用expando对象的内联初始化程序功能? (2认同)

Jel*_*gab 26

在我的例子中,我有一个我在Visual Studio上创建的单元测试项目,以及我需要在数据层库上测试方法的很多情况.我不想更改所有这些,所以我使用以下方法将测试程序集标记为朋友:

[组件:InternalsVisibleTo( "MyDataLayerAssemblyName")]

这解决了它.

例:

using System.Runtime.CompilerServices;
using Microsoft.VisualStudio.TestTools.UnitTesting;

[assembly: InternalsVisibleTo( "MyDataLayerAssembly" )]
namespace MyUnitTestProject.DataTests
{

   [TestClass]
   public class ContactTests
   {
      ...
Run Code Online (Sandbox Code Playgroud)

参考文献: InternalsVisibleToAttribute类

朋友大会


Gui*_*ira 5

就我而言,我有一个 xUnit 测试项目。

其中 'content' 是一个json 字符串

这段代码抛出错误:

dynamic parsed = JsonConvert.DeserializeObject<dynamic>(content);
Run Code Online (Sandbox Code Playgroud)

这段代码有效。使用ExpandoObject插入动态,如下所示:

dynamic parsed = JsonConvert.DeserializeObject<ExpandoObject>(content);
Run Code Online (Sandbox Code Playgroud)