2009-02-04 5 views
2

우리는 "개체"아래의 오버로드 된 메서드에 전달하기 전에 캐스팅 경우 INT32가 INT32로 threated되지 않습니다 유형의 변수를 int로서 그것을 처리하기 위해과부하 방법

public static void MethodName(int a) 
{ 
    Console.WriteLine("int"); 
} 

public static void MethodName(object a) 
{ 
    Console.ReadLine(); 
} 

Int32는 "Object"로 캐스팅 되어도 반영을 통해 얻을 수 있습니다.

public static void MethodName(object a) 
{ 
    if(a.GetType() == typeof(int)) 
    { 
     Console.WriteLine("int"); 
    } 
    else 
    { 
     Console.ReadLine(); 
    } 
} 

다른 방법이 있습니까? 어쩌면 제네릭을 사용하고 있을까요?

답변

8
public static void MethodName(object a) 
{ 
     if(a is int) 
     { 
       Console.WriteLine("int"); 
     } 
     else 
     { 
       Console.WriteLine("object"); 
     } 
} 
1

유형을 전환하려는 경우 if/else 구문을 사용하는 것이 좋습니다. switch 문 자체는 다형성 때문에 작동하지 않습니다. 만약 당신이 당신이 일반적으로 하나 다형성 또는 인터페이스 등이 함께 행동 이런 종류의 작업을 수행 할 수있는 것보다, 비 원시적 인 개체를 사용하여 위치 :

public static void MethodName(MyBaseObject obj) 
{ 
    Console.WriteLine(obj.MyVirtualFunctionCall()); 
} 
+0

감사를 호출하는 방법을

public void publish(dynamic queue) { publish(queue); Console.WriteLine("dynamic queue publishing"); } public void publish(ValidationQueue queue) { Console.WriteLine("Validation queue publishing"); } 

! 그러나 그것은 나의 경우가 아니다. –

3

아니, 컴파일시 결정됩니다 호출되는 방법의 특정 과부하 왜냐하면 당신이 리플렉션을 사용하지 않는다면 런타임에서가 아니기 때문에 int를 객체에 던지면 객체 오버로드가 호출 될 것입니다. 나는 이것을 할 수있는 다른 방법이 없다고 믿고 제네릭은 당신을 위해 그것을하지 않을 것입니다.

+0

가상 기능을 사용하지 않는 한. – GWLlosa

+0

좋은 점이지만 가상 함수는 메소드 오버로드와는 다른 점입니다. 문제는 특히 메소드 과부하에 관한 것입니다. –

2

아마도 :

int a = 0; 
string b = ""; 
object c = new object(); 
MethodName(a.GetType()); 
MethodName(b.GetType()); 
MethodName(c.GetType()); 

을 또는 :

public static void MethodName(Type t) 
{ 
    Console.WriteLine(t.Name); 
} 

는 그 다음 전화를 마지막으로

public static void MethodName<T>(T a) 
{ 
    Console.WriteLine(a.GetType().Name); 
} 

과 :

public static void MethodName<T>() 
{ 
    Console.WriteLine(typeof(T).Name); 
} 

업데이트 :
그것은 언어 어떻게 든 당신이 컴파일시에 을 다루는 것 유형을 결정할 수 있어야한다는 사실에 온다.

+0

당신의 대답 때문에 나는 유형의 이름을 쓰는 것이 목표가 아니라 유형을 기반으로 다른 행동을한다는 ​​것을 명확히하기 위해 함수를 다시 작성했습니다. –

+0

나는 그것을 보았다 : 혼란 지점은 실제로 내가 고친 질문의 첫 번째 문장에서 오타였다. –

+0

나는 갱도를 갱신하려고했으나 그렉의 대답을 아래에서 보았습니다. 그는 이미 할 수있는대로 그것을 표현했습니다. –

3

이 작동하지 않습니까?

void MethodName<T>(object a){ 
    T item = a as T; 
    // treat in the manner you require 
} 

MethodName<object>(1); 
MethodName<Int32>(1); 
+0

. 유형의 이름을 쓰는 것이 목표가 아니라 유형을 기반로하는 다른 행동을한다는 ​​것이 분명하도록 함수를 다시 작성했습니다. –

+0

어려운 것은 아니지만 컴파일 타임에 어떤 형식인지 어떻게 든 판단 할 수 있어야한다는 제약이 있습니다. –

+0

어쩌면 오버로딩은 잘못된 메서드입니다.이 경우에는 "개체"가 유형 중 하나 인 경우 모호한 요소가 발생합니다. 따라서 argument.GetType()에 대한 전환이 더 적절합니까? –

10

런타임 오버로드 확인을 사용할 수 없습니다까지 dynamic이있는 C# 4.0 :

public class Bar 
{ 
    public void Foo(int x) 
    { 
     Console.WriteLine("int"); 
    } 

    public void Foo(string x) 
    { 
     Console.WriteLine("string"); 
    } 

    public void Foo(object x) 
    { 
     Console.WriteLine("dunno"); 
    } 

    public void DynamicFoo(object x) 
    { 
     ((dynamic)this).Foo(x); 
    } 
} 

object a = 5; 
object b = "hi"; 
object c = 2.1; 

Bar bar = new Bar(); 
bar.DynamicFoo(a); 
bar.DynamicFoo(b); 
bar.DynamicFoo(c); 

dynamicthis 동적 과부하 지원을 활성화 주조, 그래서 DynamicFoo 래퍼 방법은 가장 호출 할 수있다 인수의 런타임 유형에 따라 Foo 오버로드가 발생합니다.

0

예를 들어 .NET 3.5에 대한 구현을 작성했습니다.

object a = 5; 

OverloadResolver.Invoke(MethodName, a); 

을 사용할 수 있으며 int 과부하를 사용합니다.

컴파일되고 캐시 된 람다 식으로 작동하므로 성능이 좋아야합니다.

는 사람이 그것을 필요로하는 경우 나 메일, herzmeisterderwelten, 누가

1

동적 오버로드는 .NET 3.5까지 문제했지만, 코드 몇 줄의 매우 실현 가능한 .NET 4 gmail.com에 거주하고 있습니다.

 foreach (var queue in _vodaQueueDAO.FetchAllReadyQueuesWithHighestPriority()) 
     { 
      PublishingService.publish(queue); 
     }