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'的定义**
即使它在动态对象中.
这是一个屏幕截图: 
我正在做这样的事情并尝试从测试项目调用电影功能.
Rob*_*žan 126
Jahamal的回答没有说明为什么你会得到这个错误.原因是匿名类是internal汇编.关键字dynamic不允许您绕过会员可见性.
解决方案是用命名的public class替换匿名类.
这是解释原因和另一种可能解决方案的另一个好例子.
调用
data2.Person失败的原因是类型信息data2在运行时不可用.它不可用的原因是因为匿名类型不公开.当该方法返回该匿名类型的实例时,它返回一个System.Objec引用匿名类型实例的t - 一个类型的信息不可用于主程序.动态运行时尝试查找Person在对象上调用的属性,但无法从其具有的类型信息中解析它.因此,它会引发异常.data.Name从那以后工作的呼叫Person是公共课,该信息可用并且可以很容易地解决.在以下任何情况下(如果不是更多),这可能会影响您:
- 您正在使用返回非公共非内部类型
System.Object.- 您将通过公共基类型返回非公共的非内部派生类型,并访问不在基类型中的派生类型的属性.
- 您将从不同的程序集返回包含在匿名类型中的任何内容.
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)
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类
就我而言,我有一个 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)
| 归档时间: |
|
| 查看次数: |
37598 次 |
| 最近记录: |