저는 작업중인 응용 프로그램에서 일관성, 간결함 및 일부 코드의 가독성을 향상시키는 방법을 찾고 있습니다. 시작 코드는 다음과 같습니다.일반 형식 인수가있는 형식의 C# 확장 메서드
context.GetGraphType<Bar>().Subscribe<Fizz>(
(instance, evt) => e.Execute((Bar)instance.Instance)
);
위와 같이 거의 동일한 코드 행이 있습니다.
typeof(Bar).SubscribeTo<Fizz>(context);
우선,이 날 이미 비공식적 인 규칙이되었다 무엇을 공식화을 활용할 수있는 것 :이 같은 것을보고 그것을 다시하고 싶었다. 또한, "컨텍스트가 막대 유형을 얻고 fizz에 가입 한 다음 몇 가지 작업을 수행합니다."보다는 "주어진 컨텍스트에서 fizz 이벤트를 구독합니다"와 같은 내용을 읽을 수 있기를 기대했습니다. 더 나은, 그리고 내가 그것에 대해 물어 동료가 동의했다.
이 방법을 확장 메소드로 구현하기 시작했습니다. 위의 작업을 수행하기 위해 이벤트 유형에 대한 추상적 제네릭 기본 클래스를 사용하고자 했으므로 Fizz
은 Event<T>
이됩니다. 이것은 확장 메서드에 대한 제네릭 형식 인수가 확장 메서드가 호출되는 형식이되도록 제한되어야 함을 의미합니다. 따라서 위 예의 경우 Fizz
은 Event<Bar>
이어야합니다.
이것이 가능합니까? 나는 대체 시간의 해결책으로 갔다. 그러나 그것이 성취 될 수 있다면 나는 여전히 궁금하다. 다른 제안도 환영합니다.
감사합니다.
편집 # 1 : 분명히 알 수 있듯이 추가 유형 매개 변수를 사용할 수 있다는 것을 알고 있지만 가능한 경우이를 피할 수있는 방법을 찾고 있습니다.
편집 # 2 : 내가 시나리오와 100 % 일치하지 않기 때문에 받아 들여진 답변의 약간의 변형과 함께 갈 것입니다. 결론은 Type의 확장 메서드 대신 일반 정적 클래스를 사용하여 목표를 달성 할 수 있다는 것입니다. 감사합니다 dss539!
public class Bar { }
public class Event<TSubscriber>
{
public abstract void Execute(TSubscriber source);
}
public class Fizz : Event<Bar>
{
public override void Execute(Bar bar)
{
// respond to event
}
}
public class Context { }
public static class ForType<TSubscriber>
{
public static void SubscribeTo<TEvent>(Context context)
where TEvent : Event<TSubscriber>
{
context.GetType<TSubscriber>().Subscribe<TEvent>(
(evt, args) => evt.Execute((TSubscriber)args.Source));
}
}
public static void Run()
{
ForType<Bar>.SubscribeTo<Fizz>(context);
}
나는 당신의 질문을 이해하지 못합니다. 기존 메서드 서명은 어떤 모양입니까? '구독 (이 유형 유형, 조치 )'? 자신이 가지고있는 것을 보여 주면 (또는 동등한) 설명이 도움이 될 수 있습니다. –
dss539
나는 비슷한 디자인 문제를 가지고 있다고 생각한다. 행운을 빌어 요. – leppie
@ dss539 (이 유형 유형, 컨텍스트 ctx)과 같을 것입니다. 문제는 T가 타입 이벤트 유형의 "유형"매개 변수가되도록 제약하는 방법이 없다는 것입니다. –