2011-02-04 5 views
3

.NET 내부에서 뭔가 예상했던 것과 조금 다르게 작동하는 것을 발견했습니다. 내가 붙여 넣는 코드는 이해가되지 않지만, 훨씬 복잡한 함수의 압축 된 버전입니다. 나는 익명 형식 정보를 매개 변수 (아직 익명 형식을 만들지 않은 인스턴스)로 가져오고 있으며 해당 형식의 목록을 만들어 채우고 목록을 반환해야합니다. 지금, 나는 해결책을 발견,하지만 난 방법 B가 작동하는 이유를 알고 싶어하지만 방법 A.익명 유형 및 역학 목록 ... 혼동

방법 A :

static void Main(string[] args) 
{ 
    var newItem = new { ID = Guid.NewGuid(), Name = "Test" }; 
    dynamic list; 

    list = Activator.CreateInstance(typeof(List<>).MakeGenericType(newItem.GetType())); 

    list.Add(newItem); 
    list.Add(Activator.CreateInstance(newItem.GetType(), new object[] { Guid.NewGuid(), "Test 2" })); 
} 

방법 B : 다시

static void Main(string[] args) 
{ 
    var newItem = new { ID = Guid.NewGuid(), Name = "Test" }; 
    System.Collections.IList list; 

    list = (System.Collections.IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(newItem.GetType())); 

    list.Add(newItem); 
    list.Add(Activator.CreateInstance(newItem.GetType(), new object[] { Guid.NewGuid(), "Test 2" })); 
} 

, 난 솔루션을 찾지 못했고 방법 B가 작동하지만 Method A가 작동하지 않는 이유가 궁금합니다.

고마워요!

+0

왜 그 시나리오에서 동적을 사용 하시겠습니까? 일반 목록을 작성 중입니다. 당신은 또한 당신이 받고있는 오류 또는 경고가 무엇인지를 말하지 않고 관련성이있을 수 있습니다. – Lazarus

답변

2

메서드 B에서 명시적인 IList.Add(object)을 사용하고 있기 때문에 개체를 가져 와서 익명 형식으로 캐스팅하려고합니다. 메서드 A에서 List<anonymous type>이 있고 일반 Add 메서드를 사용하고 개체를 추가하려고 시도하지만 올바르게 캐스팅 된 형식이 예상되므로 RuntimeBinderException이 표시됩니다. dynamic을 사용하지 않았다면 컴파일러 오류가 표시됩니다. 명시 적 IList.Add를 사용하려면,

((IList)list).Add(
    Activator.CreateInstance(newItem.GetType(), 
     new object[] { Guid.NewGuid(), "Test 2" })); 
+0

아! 이제는 모두 의미가 있습니다. 도와 주셔서 감사합니다! 다시 말하지만, 훨씬 더 깨끗한 솔루션이므로 메서드 B를 사용하고 있는데, 이는 메서드 A가 처음에는 작동하지 않는 이유를 명확히하는 데 도움이됩니다. – Terry

+0

물론 함수를 만들면 : T 캐스트 (T sampleItem, object item) {return (T) item; } 다음 호출 list.Add (캐스트 (newItem, Activator.CreateInstance (newItem.GetType(), 새 개체 [] {Guid.NewGuid(), "테스트 2"}}}})); 그것은 잘 작동합니다. 다시 한 번 감사드립니다! – Terry

0

당신이 방법을 작품을 만들기 위해해야 ​​할 일은 당신의 방법 A를 변경, dynamic 당신이 추가하는 액티베이터 결과를 캐스팅입니다. 많은 사람들은 C# 동적 호출이 메소드 서명을 결정하기 위해 기본적으로 정적 유형을 실제로 사용한다는 것을 인식하지 못합니다. 따라서 동적으로 인수를 형변환하여 런타임 유형을 사용하도록 지시하고 있습니다.

static void Main(string[] args) 
{ 
    var newItem = new { ID = Guid.NewGuid(), Name = "Test" }; 
    dynamic list; 

    list = Activator.CreateInstance(typeof(List<>).MakeGenericType(newItem.GetType())); 

    list.Add(newItem); 
    list.Add((dynamic)Activator.CreateInstance(newItem.GetType(), new object[] { Guid.NewGuid(), "Test 2" })); 

}