1

コードは次のとおりです。

public void DoSomething<T>(string key, Action<T> callback)
{
    Type typeParameterType = typeof(T);

    if (typeParameterType.Equals(typeof(string)))
    {
        callback("my string response");
    }
    if (typeParameterType.Equals(typeof(int)))
    {
        callback(1); // my int response
    }
    // etc...
}

ただし、エラーが発生しています... C# のジェネリックとデリゲートはすべて初めてです。

私が得ているエラーは、

Error   1   Delegate 'System.Action<T>' has some invalid arguments
Error   2   Argument 1: cannot convert from 'string' to 'T' 

私にとっては、簡単で慣用的な美しく便利なメソッドを作成することが重要です。

上記の例を次のように実装したいと思います。

int total = 0;
DoSomething<int>("doesn't matter", x => {
    total = 10 + x; // i can do this because x is an INT!!! (:
});

string message = "This message is almost ";
DoSomething<int>("doesn't matter", x => {
    message = "finished!!!"; // i can do this because x is an STRING!!! (:
});

しかし、私は立ち往生しています...助けてください!

================================================== =============================

dasblinkenlight が指摘したように、

オーバーロードは、最もクリーンでコンパイラーに優しいアプローチです...私のAPIは現在、

DoSomething("doesn't matter", new Action<string>(x => {
    message = "finished!!!"; // i can do this because x is an STRING!!! (:
}));

これは支払う費用が少なく、理解しやすいものです。

回答ありがとうございます (:

================================================== =============================

さらに調査を行うと、次のことを行うことで実際にクリーンアップできます。

DoSomething("doesn't matter", (string x) => {
    message = "finished!!!"; // i can do this because x is an STRING!!! (:
});

これに注意してください: (string x)

これで、コンパイラーは認識します! とてもクールでしょ?

4

2 に答える 2

1

intやなどの特定の型stringは にキャストできませんがT、キャストするobjectことはできます。これはうまくいくはずです:

if (typeParameterType.Equals(typeof(string)))
{
    callback((T)((object)"my string response"));
}
if (typeParameterType.Equals(typeof(int)))
{
    callback((T)((object)1)); // my int response
}

ただし、そもそもこれを行う必要があるのは少し奇妙です。ジェネリックを使用してフープをジャンプするのではなく、複数の方法を使用して問題をより適切に処理できます。

public void DoSomething(string key, Action<int> callback) {
    callback(1);
}
public void DoSomething(string key, Action<string> callback) {
    callback("my string response");
}

これらのメソッドを次のように呼び出すことができます。

DoSomething("hello", new Action<int>(x => Console.WriteLine("int: {0}", x)));
DoSomething("world", new Action<string>(x => Console.WriteLine("str: {0}", x)));

またはこのように:

DoSomething("hello", (int x) => Console.WriteLine("int: {0}", x));
DoSomething("world", (string x) => Console.WriteLine("str: {0}", x));
于 2013-09-22T04:07:59.850 に答える