2014-06-06 2 views
1

안녕하세요 저는 많은 클래스가있는 네임 스페이스가 있고 모두 메서드가 있습니다. Destroy (int id) 동적 단어를 사용하여 해당 메서드를 호출하고 싶습니다. 나는 상단에있는 사용을 포함하여 네임 스페이스를 피할 수동적을 사용하여 메서드에 대한 호출을 구성하는 방법

public bool DeleteElement<T>(T tElement) 
{ 
    Type t = typeof(T); 

    dynamic element = tElement; 
    var id = element.Id; 

    //until here everything is fine 
    //here I want to say 
    (namespace).myClassName.Destroy(id); 
    //the name of myClassName is like t.ToString() 
} 

:

은 여기 내 예입니다. 아이디어는 정적 메서드를 동적이 아닌 리플렉션을 사용하여 호출하는 것입니다. 파괴는 정적 메서드입니다.이 T.Destroy (id)와 같은 것이 필요합니다.

+2

실제로 어떤 프레임 워크를 타겟팅합니까? 'dynamic'은 C# 3.0에서 사용할 수 없습니다. 인터페이스에 대한 좋은 시간 같아요 ... (및 관련 제네릭 형식 제약 조건) – BradleyDotNET

+0

누군가가이 – Zinov

+0

에 대해 알 수 있기 때문에 C# 3.0의 사람들에게 질문을했습니다.하지만 사용할 수있는 내용이 변경되었습니다. 여전히 어떤 프레임 워크 요소가 허용되는지 알아야합니다. – BradleyDotNET

답변

5

이 정적 메서드 인 경우 정적 메서드를 호출하는 인스턴스 메서드를 만듭니다. 다음과 같이 DeleteElement 방법을 수정하지 다음

interface IDestroyable { void Destroy(); } 

을 그리고 :

public bool DeleteElement<T>(T tElement) where T : IDestroyable 
{ 
    tElement.Destroy(); 
} 

여기 dynamic를 사용하는 필요를

public void Destroy() 
{ 
    ThisClass.Destroy(this.Id); 
} 

그런 다음 모든 클래스에 의해 구현 된 IDestroyable 인터페이스를 정의 할 수 있습니다. 사실,이 상황에서 dynamic을 사용하면 종종 잘못된 디자인을 나타냅니다. 실제로 가 생성되는 시나리오를 제외하고dynamic 클래스가 생성하지만 그들은 partial 수정이있는 경우 (예를 들어, 상호 운용성 동적 언어와)

(다른있는 새로운 방법을 선언 할 필요 것은 매우 드문 발전기에 감동되지 않은 파일)


편집 : 클래스가 생성 partial하지 않은 경우, 당신이 그들을 수정할 수 없습니다 ... 그래서 또 다른 해결책은 반사를 사용하는 것입니다; 나는 당신이 그것을 피하기를 원한다는 것을 알고 있습니다. (성능상의 이유로) 각 유형에 대해 한 번만 리플렉션을 수행함으로써 성능 영향을 제한 할 수 있습니다. 각 유형에 대한 델리게이트를 생성하고 캐시해야합니다.

class DestroyHelper<T> 
{ 
    static readonly Action<int> _destroy; 
    static readonly Func<T, int> _getId; 
    static DestroyHelper() 
    { 
     var destroyMethod = typeof(T).GetMethod("Destroy", BindingFlags.Static | BindingFlags.Public); 
     _destroy = (Action<int>)Delegate.CreateDelegate(typeof(Action<int>), destroyMethod); 
     var getIdMethod = typeof(T).GetProperty("Id").GetGetMethod(); 
     _getId = (Func<T, int>)Delegate.CreateDelegate(typeof(Func<T, int>), getIdMethod); 
    } 

    public static void Destroy(T element) 
    { 
     _destroy(_getId(element)); 
    } 
} 
+0

모든 클래스가 생성되지 않습니다. 때마다 무언가 변경 IDestroyable 상속을 넣어 모든 코드를 수정해야합니다, 이것은 내가 찾던 접근 방식이 아닙니다 – Zinov

+0

@ Zinov, 당신은이 클래스의 생성을 제어 할 수 있다고 가정합니까? 그리고 그들은 우연히'부분적인 '것으로 선언 되었습니까? 그렇다면 내 솔루션이 계속 작동 할 수 있습니다. –

+0

다시 생각해보십시오. Reflection이 아닌 dynamic을 사용하여 정적 메서드를 호출하는 것이 좋습니다. 나는 Reflection을 사용하는 솔루션을 가지고 있는데, 동적 인 – Zinov