나는 두 개의 과부하가 걸리는 상황이있다. 나는 어떤 상황이 사실이라면, 나는 과부하 중 하나를 부른다. 그렇지 않으면 나는 다른 것을 부른다. 나는 영리하고 공통된 코드를 객체와 조건을 취하는 단일 일반 메소드로 리팩토링하고 오버로드 된 메소드를 호출하거나 그렇지 않으면 공통 코드를 호출하기로 결정했다.일반 형식의 인스턴스를 다른 강력한 형식의 메서드에 전달할 수 있습니까?
코드의 많은 간단한 예 :
/// <summary>
/// Dummy interface
/// </summary>
public interface ITest1
{ }
/// <summary>
/// Dummy interface
/// </summary>
public interface ITest2
{ }
/// <summary>
/// Generic Class
/// </summary>
public class GenericClass
{
/// <summary>
/// First overload
/// </summary>
/// <param name="test1"></param>
public void TestMethod(ITest1 test1)
{ }
/// <summary>
/// Second overload
/// </summary>
/// <param name="test2"></param>
public void TestMethod(ITest2 test2)
{ }
/// <summary>
/// method with common logic
/// </summary>
/// <typeparam name="TInterfaceType">
/// Type of the test object
/// </typeparam>
/// <param name="test">
/// Test object to pass to the method.
/// </param>
public void ConditionallyCallTest<TInterfaceType>(
TInterfaceType test, bool someLogic)
{
if (someLogic)
{
this.TestMethod(test);
}
else
{
// .. Perform Common operations here
}
}
}
이 코드 세그먼트를 컴파일하는 경우이, 아무것도하지 않는다는 사실을 무시, 당신은 TInterfaceType을 변환 할 수있는 컴파일러 오류가 발생합니다 ITest1.
내가 그렇게 유형 검사를 할 수있는 유형을 지정 때까지 컴파일러 기다려야 기대했다 :
GenericClass g = new GenericClass();
// We have an overload, so this is OK:
g.ConditionallyCallTest<ITest1>(test1);
// We have an overload, so this is OK:
g.ConditionallyCallTest<ITest2>(test2);
// Compiler error, no overload available:
g.ConditionallyCallTest<UnknownType>(obj);
는이 사용하는 C#을 그런 짓을 할 수 있습니까?
또한 허용되는 유형을 지정하기 위해 where 절을 사용하려고했지만 where 절이 지정된 유형과 관계 만 지정하는 방법을 알아낼 수 없었습니다.
편집 그래서이 문제를 해결하기 위해 어떤 다른 제안이, 또는 내가 여기에 언어에 의해 제한하고 내가 mentioned in the comments below, 내가 과부하 방법을 일치 만드는 것을 피하기 위해 시도하는 것처럼
?
에서 상속한다는 인터페이스 IHasTestMethod이 필요하십니까? 아니면 "테스트"라는 가짜 이름입니까? – strager
이것은 실제 코드가 너무 광범위하여 게시 할 수 없기 때문에 문제의 구성 예제 일뿐입니다. –