[c#] dynamic은 프로젝트 참조의 속성에 대한 정의를 포함하지 않습니다.

다음과 같은 오류가 발생합니다.

‘개체’에 ‘제목’에 대한 정의가 없습니다.

모든 코드는 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있기 때문에 작품을 잘 Personpublic 클래스가이 정보를 사용할 수 있습니다 쉽게 해결할 수 있습니다.

이는 다음과 같은 경우에 영향을 미칠 수 있습니다 (그 이상은 아닐 경우).

  1. .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);


답변