2014-12-22 1 views
0

내 UT에서 일부 코드 경로를 확인해야 할 때이 문제가 발생합니다.일반 형식으로 익명 형식의 일반 형식 인스턴스, 원래 형식으로 제대로 변환하는 방법?

데이터 필드가 올바르게 설정되었는지 확인하려면 원래 유형으로 다시 변환해야합니다.

나는 추상 클래스가 정의하고 내 UT는

public interface ITestInterface { }; 


public class TestClass<T> : ITestInterface 
{ 
    public T member { get; set; } 
} 

public static class Util 
{ 
    public static ITestInterface Create<C>(C t) 
    { 
     return new TestClass<C> { member = t }; 
    } 

    public static ITestInterface CreateInstance() 
    { 
     return Create(new 
     { 
      p1 = 100, 
      p2 = "string" 
     }); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 

     var a = Util.CreateInstance(); 

     var b = a as TestClass<Object>; 
     // this will be "null" in this example 
     // So, how can I convert back to its real type? 
     // And get the "member" data 
    } 
} 

내가이 예는 정확히 내 질문 제가

더 많은 환자에 대한주십시오 원하는을 설명 할 수 있다고 생각이 예를 들어 주요 기능에 지금 : 당신은 익명 형식을 사용하는 이유

  1. 은 왜 인터페이스
  2. 를 사용

    : 사용 템플릿 클래스는 제네릭이 아닌 인터페이스

나는 코드가 이미 말씀을 전에서 파생 왜

  • , 나는

    는 내가하고 싶은 것은 (적어도 현재) 변경할 수 없습니다

    1. 확인하는 인터페이스가 있으면, I는 회원 정보를 확인할 수 있고, 그 형태로 다시 변환 할 필요 ITestInterface
    2. 로부터 파생 된 클래스의 인스턴스 인 경우

    이 시나리오를 기반으로 몇 가지 솔루션/아이디어를 공유하십시오. BTW

    물론

    내가 유형으로 다시 변환 할 마지막 성명에서 "개체"를 사용하고 알고 좋은 (또는 분명히 잘못)이 아니라 사실 내가 모르는 다른 어떤 것들 I 여기에 넣을 수 있습니다. "객체"는 직관적 인 시도입니다. 이 사건을 처리 할 수있는 자산 방법을 알려주십시오 (어쩌면 "객체"를 대체하기 위해 사용 된 것 이상).

  • +0

    내가 여기 이해하지 못하는 뭔가가있다. 왜'a'를'TestClass '로 변환하려고합니까? –

    +0

    'Util.Create'에 의해 반환 된'TestClass' 인스턴스의'p1' 속성을 검색하는 것이 목표입니까? –

    +0

    제 사건은 간단합니다. 이것은 유타에서 코드를 확인하는 데 사용됩니다. 따라서 해당 인터페이스의 데이터를 다시 가져와야합니다. – winterTTr

    답변

    0

    저는 이것이 XY 문제가 아니라 당신이 물어 본 질문에 대답하는 것이 아닙니다.

    익명 형식과 동일한 범위에있는 경우 제네릭의 형식 유추를 사용하여 익명 형식으로 다시 캐스팅 할 수 있습니다.

    아래 예제에서는 Util.Create를 호출하기 전에 익명 형식의 항목을 만들어 나중에 사용할 수있는 변수에 해당 형식의 인스턴스가 있도록합니다. 그런 다음 제 2 매개 변수를 기반으로 유형 유추를 사용하는 일반 메소드 GetAsTestClass<T>을 호출하여 T를 익명 유형으로 설정합니다. 그런 다음 item as TestClass<T>을 반환합니다. 여기서 T는 익명 형식입니다.

    public void TestMethod1() 
    { 
        var anonItem = new 
        { 
         p1 = 100, 
         p2 = "string" 
        }; 
    
        var a = Util.Create(anonItem); 
    
        var b = GetAsTestClass(a, anonItem); 
        // this will be "null" in this example 
        // So, how can I convert back to its real type? 
        // And get the "member" data 
    
        var c = b.member; 
        Assert.AreEqual(100, c.p1); 
    
    } 
    
    public TestClass<T> GetAsTestClass<T>(ITestInterface item, T silentType) 
    { 
        return item as TestClass<T>; 
    } 
    

    편집 :

    귀하의 특정 요구 사항는 형태 보증 옵션을 배제하기 위해 나타납니다. 아래는 반사 및 역학의 비 유형 안전 메소드를 사용하는 코드 샘플입니다. 동적 버전이 작동하려면 프로젝트에서 Microsoft.CSharp에 대한 참조가 필요합니다.

    var a = Util.Create(new 
    { 
        p1 = 100, 
        p2 = "string" 
    }); 
    
    var memberAnon = a 
        .GetType() 
        .GetProperty("member") 
        .GetValue(a); 
    
    var p1 = memberAnon 
        .GetType() 
        .GetProperty("p1") 
        .GetValue(memberAnon); 
    
    Assert.AreEqual(100, p1); 
    

    또는 동적 인 방법

    dynamic dynamicVar = a; 
    Assert.AreEqual(100, dynamicVar.member.p1); 
    
    +0

    이 제안에 감사드립니다. 정말 통찰력이 있습니다. 하지만 제 경우에는 가능하지 않을 수도 있습니다. 사실, 익명의 타입은 같은 스코프로 생성되지 않으므로, 설정 될 anonItem을 얻을 방법이 없습니다. 실제 코드에서'anonItem'은'Util.Create' 함수에서 생성되고'TestClass <익명 타입>'을 외부 범위로 리턴합니다. 하지만 당신의 대답은 정말 좋습니다. – winterTTr

    +0

    좀 더 정확하게 샘플 코드를 업데이트하겠습니다. – winterTTr

    관련 문제