2010-03-08 6 views
2

제네릭과 그 사용법을 설명하는 몇 가지 유용한 링크를 사용할 수 있습니다. 그러나 나는 또한 현재의 프로젝트에서 일하는 것에 관한 매우 구체적인 질문을 가지고있다.제네릭을 이해하는 데 도움이 필요합니다. 추상 형식을 사용하는 방법 질문

을 감안할 때이 클래스의 생성자 :

public class SecuredDomainViewModel<TDomainContext, TEntity> : DomainViewModel<TDomainContext, TEntity> 
     where TDomainContext : DomainContext, new() 
     where TEntity : Entity, new() 

    public SecuredDomainViewModel(TDomainContext domainContext, ProtectedItem protectedItem) 
      : base(domainContext) 
     { 
      this.protectedItem = protectedItem; 
     } 

그리고 그것의 생성이 방법 :

   DomainViewModel d; 
       d = new SecuredDomainViewModel<MyContext, MyEntityType>(this.context, selectedProtectedItem); 

내가 MyContext 내에서 20 개의 EntityTypes을 가정하면, 큰없이 생성자를 호출 할 수있는 쉬운 방법이있다 switch 문? d는 DomainViewModel 내가 나중에 SecuredDomainViewModel에서 메서드에 액세스 할 필요가 있기 때문에

또한, 내가이 일을해야 할 것 같다

if (((SecuredDomainViewModel<MyContext, MyEntityType>)d).CanEditEntity) 

그러나 다시 "MyEntityType"실제로 20 개 diffent 유형 중 하나가 될 수 있습니다. MyEntityType이 일종의 Reflection에서 반환 된 이러한 유형의 명령문을 작성하는 방법이 있습니까?

명확화를위한 추가 정보 : ConstructorInfo를 조사 하겠지만 내가하고 싶은 것을 잘못 설명했을 수 있습니다.

원본 게시글에 DomainViewModel, d이 있다고 가정합니다.

이 세 가지 방법을 통해 구성되었을 수 있습니다 :

ex: if (((SecuredDomainViewModel<MyContext, Order)d).CanEditEntity) 
ex: if (((SecuredDomainViewModel<MyContext, Invoice)d).CanEditEntity) 
ex: if (((SecuredDomainViewModel<MyContext, Consumer)d).CanEditEntity) 

내가 가진 가정 :

d = new SecuredDomainViewModel<MyContext, Order>(this.context, selectedProtectedItem); 

d = new SecuredDomainViewModel<MyContext, Invoice>(this.context, selectedProtectedItem); 

d = new SecuredDomainViewModel<MyContext, Consumer>(this.context, selectedProtectedItem); 

나중에, 나는 현재이 방법으로 호출해야합니다 SecuredDomainViewModel에 메서드에 액세스 할 필요가 이 컨텍스트에서 N + 엔티티 유형을 사용하려면 다음과 같이 문의하십시오.

여기서 CurrentEntityType은 현재 항목 엔터티 유형을 기반으로 주문, 송장 또는 소비자를 반환하는 일종의 함수 또는 다른 유형의 호출이었습니다.

그럴 수 있습니까?

+0

당신이 뭘하려고하는지 설명해 주시겠습니까? 나는이 질문의 요점을 groking하지 않는다. – jfar

+0

기본적으로, 나는 이런 식으로 DOM을 할 수 있기를 원하지만,이 특정 방법은 불가능하다는 것을 알고 있습니다. 유형 entityType; entityType = "Orders" if (((SecuredDomainViewModel ) d) .CanEditEntity) – kmacmahon

답변

1

... 또한

, 새로운() 생성자과 같은 작업을 수행 할 수 있습니다 인수를 (그래서 당신은 단지 new TEntity()를 쓸 수 있습니다)이없는 제네릭 형식의 생성자를 호출하지만이 생성자를 호출 할 경우, 내가 사용하는 하나의 편리한 트릭이 매개 변수는 대리자로의 전달 :

public void Method<T>(Func<string, bool, T> ctor) { 
    // ... 
    T newobj = ctor("foo", true); 
    // ... 
} 

//called later... 
Method((s, b) => new MyClass(s, b)); 
+1

우리는 클래스를 리팩토링하여 인터페이스를 노출하기로 결정했습니다. – kmacmahon

-2

나는 링크를 도울 수 없으며 그 중 하나가 아닐 수도있다.

당신이 유형이있는 경우, 생성자 얻을 수

생성자 :

ConstructorInfo construtor = typeof(MyEntityType).GetConstructor(new object[]{TDomainContext, ProtectedItem}); 

유형 당신이 무엇을 찾고 있는지 정말 모르겠어요

,하지만 난 단지 수

if (((SecuredDomainViewModel<MyContext, entityType>)d).CanEditEntity) 
{ 
    entityType=typeof(Orders) 
} 

같은 것을보십시오.

당신은 다음 인터페이스를 통해 속성을 부르는 오프 상속 SecuredDomainViewModel을, 그것에 CanEditEntity 속성이 아닌 일반적인 인터페이스를 만들 수 있습니다
+0

나는 무엇을 하려는지 자세한 정보를 추가했습니다. – kmacmahon

+0

이것은 분명히 당신이 찾고 있었던 것의 아무것도 아니 었습니다. 사과합니다. 인터페이스를 확장하는 접근 방식은 견고하고 합리적입니다. (어, 제네릭 인터페이스 방법을 사용하고 있다고 생각하십니까? 그렇지 않으면 도움을 요청하십시오.) – ANeves

+0

그래, 그랬어! 시간을내어이 질문을 검토해 주셔서 감사합니다. -K – kmacmahon

관련 문제