이 정적 메서드 인 경우 정적 메서드를 호출하는 인스턴스 메서드를 만듭니다. 다음과 같이 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));
}
}
실제로 어떤 프레임 워크를 타겟팅합니까? 'dynamic'은 C# 3.0에서 사용할 수 없습니다. 인터페이스에 대한 좋은 시간 같아요 ... (및 관련 제네릭 형식 제약 조건) – BradleyDotNET
누군가가이 – Zinov
에 대해 알 수 있기 때문에 C# 3.0의 사람들에게 질문을했습니다.하지만 사용할 수있는 내용이 변경되었습니다. 여전히 어떤 프레임 워크 요소가 허용되는지 알아야합니다. – BradleyDotNET