다음과 같은 오류가 발생합니다.
‘개체’에 ‘제목’에 대한 정의가 없습니다.
모든 코드는 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);
}
}
동일한 프로젝트에서 잘 작동하지만 ConsoleApplication1에 대한 참조로 ConsoleApplication2를 추가하고 정확히 동일한 코드를 추가하면
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));
}
}
}
오류가 발생합니다.
‘객체’에 ‘제목’에 대한 정의가 없습니다 **
동적 개체에 있더라도.
- o.Title ‘o.Title’에서 ‘Microsoft.CSharp.RuntimeBinder.RuntimeBinderException’유형의 예외가 발생했습니다. dynamic {Microsoft.CSharp.RuntimeBinder.RuntimeBinderException}
다음은 스크린 샷입니다.
나는 이와 같은 일을하고 테스트 프로젝트에서 영화 함수를 호출하려고합니다.
답변
ExpandoObject를 사용해야합니다.
dynamic o = new ExpandoObject();
o.Title = "Ghostbusters";
o.Rating = "PG";
Console.WriteLine(m.PrintMovie(o));
답변
Jahamal의 대답은 오류가 발생하는 이유 를 말하지 않습니다 . 그 이유는 익명 클래스가 internal
어셈블리에 있기 때문입니다 . 키워드로 dynamic
회원 가시성을 우회 할 수 없습니다.
해결책은 익명 클래스를 명명 된 공용 클래스로 바꾸는 것입니다.
그 이유와 다른 가능한 해결책을 설명하는 또 다른 좋은 예가 있습니다 .
에 대한 호출이
data2.Person
실패 하는 이유는 의 유형 정보data2
를 런타임에 사용할 수 없기 때문입니다. 사용할 수없는 이유는 익명 유형이 공개되지 않기 때문입니다. 메서드가 해당 익명 유형의 인스턴스를 반환 할 때 익명 유형System.Objec
의 인스턴스를 참조하는 t를 반환합니다 . 즉, 주 프로그램에서 정보를 사용할 수없는 유형입니다. 동적 런타임Person
은 개체에 대해 호출 된 속성을 찾으려고 하지만 개체에있는 유형 정보에서 확인할 수 없습니다. 따라서 예외가 발생합니다. 호출에data.Name
있기 때문에 작품을 잘Person
public 클래스가이 정보를 사용할 수 있습니다 쉽게 해결할 수 있습니다.
이는 다음과 같은 경우에 영향을 미칠 수 있습니다 (그 이상은 아닐 경우).
- .NET을 사용하여 비공개, 비 내부 유형을 반환합니다
System.Object
. 2. 공개 기본 유형을 통해 비공개, 내부가 아닌 파생 유형을 반환하고 기본 유형에없는 파생 유형의 속성에 액세스합니다. 3. 다른 어셈블리에서 익명 형식으로 래핑 된 항목을 반환합니다.
답변
제 경우에는 Visual Studio에서 만든 단위 테스트 프로젝트가 있었고 데이터 계층 라이브러리에서 메서드를 테스트해야하는 많은 경우가있었습니다. 모두 변경하고 싶지 않았으므로 다음을 사용하여 테스트 어셈블리를 친구로 표시했습니다.
[assembly:InternalsVisibleTo("MyDataLayerAssemblyName")]
그리고 그것은 그것을 해결했습니다.
예:
using System.Runtime.CompilerServices;
using Microsoft.VisualStudio.TestTools.UnitTesting;
[assembly: InternalsVisibleTo( "MyDataLayerAssembly" )]
namespace MyUnitTestProject.DataTests
{
[TestClass]
public class ContactTests
{
...
참조 :
답변
제 경우에는 xUnit 테스트 프로젝트가 있습니다.
여기서 ‘content’는 json 문자열 입니다.
이 코드는 오류를 발생시킵니다.
dynamic parsed = JsonConvert.DeserializeObject<dynamic>(content);
이 코드는 작동합니다. 다음 과 같이 동적으로 구성된 ExpandoObject를 사용하십시오 .
dynamic parsed = JsonConvert.DeserializeObject<ExpandoObject>(content);