2

タイプInt32の変数は、以下のオーバーロードされたメソッドに渡す前に「オブジェクト」にキャストすると、Int32として脅威にさらされることはありません。

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

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

「オブジェクト」にキャストされている場合でも、それをInt32として処理するには、リフレクションを使用します。

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

それを行う別の方法はありますか?多分ジェネリックを使用していますか?

4

8 に答える 8

10

ランタイム過負荷の解決は、C#4.0まで利用できませんdynamic

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);

にキャストthisするdynamicと動的オーバーロードのサポートが有効になるため、ラッパーメソッドは引数の実行時型に基づいてDynamicFoo最適なオーバーロードを呼び出すことができます。Foo

于 2009-02-04T20:38:48.940 に答える
8
public static void MethodName(object a)
{
        if(a is int)
        {
                Console.WriteLine("int");
        }
        else
        {
                Console.WriteLine("object");
        }
}
于 2009-02-04T19:49:53.797 に答える
3

これはうまくいきませんか?

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

MethodName<object>(1);
MethodName<Int32>(1);
于 2009-02-04T20:00:57.957 に答える
3

いいえ、呼び出されるメソッドの特定のオーバーロードは、リフレクションを使用していない限り、実行時ではなくコンパイル時に決定されるため、int をオブジェクトにキャストした場合、オブジェクトのオーバーロードが呼び出されます。これを行う方法は他にないと思いますし、ジェネリックもあなたのためにそれを行いません.

于 2009-02-04T19:51:52.653 に答える
2

多分:

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

次に、それを呼び出します。

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

または:

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

そして最後に:

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

更新:言語は、コンパイル時に処理する型を何らかの方法で決定できなければならない
という事実に帰着します。

于 2009-02-04T19:54:58.217 に答える
1

動的オーバーロードは .NET 3.5 までは問題でしたが、.NET 4 では数行のコードで非常に実現可能です。

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

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

呼び方

     foreach (var queue in  _vodaQueueDAO.FetchAllReadyQueuesWithHighestPriority())
        {
            PublishingService.publish(queue);
        }
于 2011-11-11T05:45:13.050 に答える
1

型をオンにしようとしている場合、if/else 構造にほとんどこだわっています。ポリモーフィズムのため、switch ステートメント自体は機能しません。非プリミティブ オブジェクトを使用している場合は、通常、次のようなポリモーフィズムまたはインターフェイスを使用して、この種の動作を実現できます。

public static void MethodName(MyBaseObject obj)
{
     Console.WriteLine(obj.MyVirtualFunctionCall());
}
于 2009-02-04T19:51:17.897 に答える