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;

如果我误解了你在说什么,这里还有另一种方法

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

你最好使用转换器委托之类的东西

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

以上是一个通用接口,这就是我使用“对象”作为类型的原因

使用实际的通用接口是否更有意义:

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

    return output;
}

U output = t.Transform(input) as U;
于 2009-09-03T16:21:22.057 回答
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 回答