10

これまでのところ、これは私にとって少しトリッキーであることが証明されています. System.Type オブジェクトを使用してオブジェクトを型キャストできるかどうか疑問に思っています。

私が意味することを以下に示しました:

public interface IDataAdapter
{
    object Transform(object input);
    Type GetOutputType();
}

public class SomeRandomAdapter : IDataAdapter
{
    public object Transform(object input)
    {
        string output;

        // Do some stuff to transform input to output...

        return output;
    }

    public Type GetOutputType()
    {
        return typeof(string);
    }
}

// Later when using the above methods I would like to be able to go...
var output = t.Transform(input) as t.GetOutputType();

上記は汎用インターフェイスであるため、型に「オブジェクト」を使用しています。

4

5 に答える 5

8

これを行う典型的な方法は、次のようにジェネリックを使用することです。

public T2 Transform<T, T2>(T input)
{
    T2 output;

    // Do some stuff to transform input to output...

    return output;
}

int    number = 0;
string numberString = t.Transform<int, string>(number);

以下のコメントで述べたように、ジェネリックは C++ テンプレートに非常に似ています。ジェネリックに関する MSDNのドキュメントはこちらで参照できます。記事「C++ テンプレートと C# ジェネリックの違い (C# プログラミング ガイド)」も参考になるでしょう。

最後に、メソッド本体内で何をしたいのかを誤解している可能性があります。ジェネリック型に制約を指定しない限り、任意の型Tを別の任意の型に変換する方法がわかりません。T2たとえば、両方が何らかのインターフェースを実装する必要があることを指定する必要がある場合があります。型パラメーターの制約 (C# プログラミング ガイド)では、C# でこれを行う方法について説明しています。

編集: 改訂された質問を考えると、Marco M. からのこの回答は正しいと思います (つまり、現在インターフェイスConverterを使用しようとしている場所でデリゲートを使用する必要があると思います)。IDataAdapter

于 2009-09-03T16:21:14.100 に答える
7

文字列を返すと確信しているのに、なぜ複雑にするのですか?

var output = t.Transform(input) as string;

私があなたの言っていることを誤解しているなら、ここにもう1つの方法があります

var output = Convert.ChangeType(t.Transform(input), t.GetOutputType());
于 2009-09-03T16:30:54.893 に答える
3

Converter デリゲートのようなものを使用することをお勧めします

public delegate TOutput Converter<TInput, TOutput>(TInput input);

例として、msdnをチェックしてください

public static void Main()
{
    // Create an array of PointF objects.
    PointF[] apf = {
        new PointF(27.8F, 32.62F),
        new PointF(99.3F, 147.273F),
        new PointF(7.5F, 1412.2F) };

    // Display each element in the PointF array.
    Console.WriteLine();
    foreach( PointF p in apf )
        Console.WriteLine(p);

    // Convert each PointF element to a Point object.
    Point[] ap = Array.ConvertAll(apf, 
        new Converter<PointF, Point>(PointFToPoint));

    // Display each element in the Point array.
    Console.WriteLine();
    foreach( Point p in ap )
    {
        Console.WriteLine(p);
    }
}

public static Point PointFToPoint(PointF pf)
{
    return new Point(((int) pf.X), ((int) pf.Y));
}
于 2009-09-03T16:24:56.700 に答える
2

これは私が行ったことです(IEnumerable構造に基づいています):

public interface IDataAdapter
{
    object Transform(object input);
}

public interface IDataAdapter<OutT, InT> : IDataAdapter
{
    OutT Transform(InT input);
}

public class SomeClass : IDataAdapter<string, string>
{
    public string Transform(string input)
    {
        // Do something...
    }

    public object Transform(object input)
    {
        throw new NotImplementedException();
    }
}
于 2009-09-03T16:59:55.863 に答える
2

上記は汎用インターフェイスであるため、型に「オブジェクト」を使用しています

実際のジェネリック インターフェイスを使用する方が理にかなっているでしょうか。

public U Transform<T, U>(T input)
{
    string output;

    return output;
}

U output = t.Transform(input) as U;
于 2009-09-03T16:21:22.057 に答える