2009-09-03 132 views
11

迄今为止,这个对我来说证明是有点棘手。我想知道是否可以使用System.Type对象类型转换对象。类型使用C中的“类型”对象投射对象#

我已经说明下面我的意思:

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(); 

以上是一个通用的接口,这就是为什么我使用“对象”的类型。

回答

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

我在示例中没有使它清楚,但是这两种方法在IDataAdapter接口中。 – Ryall 2009-09-03 16:31:36

+0

再次感谢杰夫。 – Ryall 2009-09-03 16:37:20

+0

没问题,我再次更新了我的答案。 – 2009-09-03 16:58:55

2

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

,岂不更有意义使用一个实际的通用接口:

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

    return output; 
} 

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

这些看起来像C++中的模板 - 实际上还没有在C#中涵盖它们。谢谢! – Ryall 2009-09-03 16:24:27

+0

我对你如何在泛型之外使用'U'有点困惑。你给了什么范围? – Ryall 2009-09-03 16:25:44

+0

@Kelix:“U”是你的实际类型,你不会真的使用那样的“U”。看@ Jeff的回答,并注意他的T2被替换为“string”并以相同的方式进行匹配。 – 2009-09-03 16:34:29

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)); 
} 
+0

这是如何让Type对象转换另一个对象的? TInput和TOutput不是对象,需要在编译时知道。 – Despertar 2012-02-18 23:16:12

7

为什么让它复杂,当你确信它返回一个字符串?

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

如果我误解你说的话,这里是另一种方式

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

因为这个例子是一个接口 - 现在正在更新。 – Ryall 2009-09-03 16:32:48

+0

更新,感谢您的回答。 – Ryall 2009-09-03 16:36:25

+0

我会为此打1!我喜欢''Convert.ChangeType()''的想法,并提供对象的类型作为第二个参数,所以它将被改变为该类型。我正在另一个图书馆工作,希望这会挽救我的夜晚。谢谢@shahkalpesh – 2015-08-25 14:15:04

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(); 
    } 
} 
相关问题