使用C#中的“Type”对象键入转换对象

时间:2009-09-03 16:17:42

标签: c# reflection casting types boxing

到目前为止,这个对我来说有点棘手。我想知道是否可以使用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();

以上是一个通用界面,这就是我为类型使用“object”的原因。

5 个答案:

答案 0 :(得分: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 documentation for Generics here,文章“Differences Between C++ Templates and C# Generics (C# Programming Guide)”可能会有所帮助。

最后,我可能误解了你想在方法体内做什么:我不确定如何将任意类型T转换为另一种任意类型T2,除非你指定对泛型类型的约束。例如,您可能需要指定它们都必须实现某个接口。 Constraints on Type Parameters (C# Programming Guide)介绍了如何在C#中执行此操作。

修改:鉴于您修改过的问题,我认为this answer from Marco M.是正确的(也就是说,我认为您应该使用当前正在尝试使用的Converter代理你的IDataAdapter界面。)

答案 1 :(得分:7)

为什么当你确定它返回一个字符串时,它会变得复杂?

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

如果我误解了你的意思,这里还有一个方法

var output = Convert.ChangeType(t.Transform(input), t.GetOutputType());

答案 2 :(得分: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));
}

答案 3 :(得分:2)

  

以上是一个通用界面,这就是我为类型

使用“object”的原因

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

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

    return output;
}

U output = t.Transform(input) as U;

答案 4 :(得分: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();
    }
}