2014-03-05 5 views
0

런타임에 반환 형식이 결정되는 함수를 만들려고합니다. object 또는 dynamic을 반환 할 수 있다는 것을 알고 있지만 내 목적은 입력 된 object을 반환하고 컴파일러 및 InteliSense에서 인식하도록하는 것입니다.함수에서 함수의 반환 형식을 동적으로 만들거나 설정하십시오.

내가 반환 한 후 내 object을 캐스팅 할 수 있다는 것을 알고 있으며이를 구현하는 것이 가장 쉬운 방법이지만 프로그래밍 정신이 아닙니다. 여기

내가

를 만들기 위해 노력하고있어의 예입니다 : 나는 실제로 버튼을 원하지 않는 및 그리드는 ... 그건 그냥 예입니다.

Type T; 
public T Question(bool aBool) 
{ 
    if (aBool) 
    { 
     T = typeof(Button); 
     return new Button(); 
    } 
    else 
    { 
     T = typeof(Grid); 
     return new Grid(); 
    } 
} 

이제 분명히 작동하지 않으며 이유를 이해합니다. 그러나 누군가가 작동하는 방식을 가지고 있는지, 또는 이것이 C#의 현재 상태에서 가능하지 않은지 알고 싶습니다.

편집 : 의견에 대한 답변 ... "마법"처럼 보일 것입니다. 컴파일러가 내 결과가 어떻게 작동하는지 이해해야한다는 것을 이해합니다. 컴파일러/Intellisense/Visual Studio는 이미 다른 많은 작업을 수행합니다. 이러한 것들은 도달 할 수없는 코드를 감지하거나 시각적 미리보기를 그리는 것처럼 간단 할 수 있지만. 이것이 구현 된 기능인지 궁금합니다.

+0

불분명.앞으로 언젠가는 코드의 실행 결과를 예측하여 컴파일러가 마술을하기를 원합니다. "반환 유형은 런타임에 결정됩니다 ... 컴파일러가 인식합니다". –

+2

컴파일러가 런타임 전까지 해결되지 않을 때 inteliSense의 유형을 어떻게 결정합니까? 그것은 단지 이해가되지 않습니다. –

+0

제네릭을 사용하더라도 컴파일러는 컴파일 할 때 유형을 결정할 수 있어야합니다. 여기에 나쁜 추상화가있는 것처럼 들리 겠지만, 우리가 어떤 문제를 해결하려고했는지 알았다면 더 나은 행동 방침을 조언 할 수 있습니다 ... – David

답변

6

이러한 메소드의 사용자가 리턴 유형이 동적이라는 사실에 실제로 의존 할 수있는 유일한 방법은 적어도 하나의 메소드 호출에 대해 리턴 유형이 컴파일시 정적으로 알려져 있는지 여부입니다.

메서드가 작성된 시점에서 알 수없는 유형의 메서드가 있지만 해당 메서드에 대한 특정 호출이 make 일 때 고정되어있는 메서드에 대한 특정 기능이 있습니다. 이 기능을 "generics"라고합니다. 정말 정말 유용한 인에 대한 많은 잠재력을 가지고 진정으로 동적 반환 형식에 사용할 수있는 유일한 옵션이다

public T Foo<T>() 
    where T : new() 
{ 
    return new T(); 
} 

.

이것이 원하는 것이 아니거나 실행 가능한 옵션이 아닌 경우 확률이 매우 높습니다. 메소드에 동적으로 변경되는 반환 유형이 없어야합니다. 대신 여러 구현을 가질 수있는 좀 더 일반화 된 유형의 고정 된 반환 유형이 있어야합니다. 일반적으로 이는 가능한 구현의 수를 반환 할 수있는 인터페이스를 의미합니다. 이것은 호출자가 구현 내용을 실제로 알거나 신경 쓸 필요가없는 경우 수행되어야합니다. 필요한 모든 것을 노출하는 인터페이스의 구현을 제공한다는 점만 알아야합니다. 귀하의 경우에는 발신자가 어떤 종류의 제어를 받았음을 알아야하고 Control의 API가 제공해야하는 모든 것을 제공해야하는 경우 Control과 같은 것이 유용 할 수 있습니다.

0

매개 변수없는 생성자가 있고 유형을 new constraint으로 표시하면 유형을 사용할 수 있습니다. 그것보다 더 많이하고 싶다면 애매 모르게 또는 활성화 제를 사용해야합니다.

0

당신은이 경우 예를 들어

에 동적 키워드를 사용할 수 있습니다

달성하려는 것을
public dynamic CreatObj(string caller) 
{ 
    if (caller.equals("x")) 
     return x; 
    else 
     return y; 
} 
+0

"Dynamic"을 사용할 수는 있지만 소비자 측에서 캐스팅해야한다는 것을 알고 있습니다. 나는 그것을 피할 방법을 찾고있었습니다. – BenVlodgi

관련 문제