代码之家  ›  专栏  ›  技术社区  ›  Ryall

使用C中的“type”对象类型转换对象#

  •  11
  • Ryall  · 技术社区  · 17 年前

    到目前为止,这个对我来说有点棘手。我想知道是否可以使用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 回复  |  直到 10 年前
        1
  •  8
  •   Community Mohan Dere    9 年前

    典型的方法是使用泛型,比如:

    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 接口。

        2
  •  7
  •   shahkalpesh    17 年前

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

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

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

    var output = Convert.ChangeType(t.Transform(input), t.GetOutputType());
    
        3
  •  3
  •   Marco M.    10 年前

    你最好使用像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));
    }
    
        4
  •  2
  •   Ryall    17 年前

    这就是我所做的(基于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();
        }
    }
    
        5
  •  2
  •   Tim Cooper    14 年前

    上面是一个通用接口,这就是为什么我要为类型使用“object”的原因。

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

    public U Transform<T, U>(T input)
    {
        string output;
    
        return output;
    }
    
    U output = t.Transform(input) as U;