在C#中使用“类型”对象键入转换对象

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

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

这样做的典型方法是使用generics,如下所示:

 public T2 Transform(T input) { T2 output; // Do some stuff to transform input to output... return output; } int number = 0; string numberString = t.Transform(number); 

正如您在下面的评论中提到的,generics与C ++模板非常相似。 您可以在此处找到Generics的MSDN文档 ,文章“ C ++模板与C#Generics之间的差异(C#编程指南) ”可能会有所帮助。

最后,我可能误解了你想在方法体内做什么:我不确定如何将任意类型T转换为另一个任意类型T2 ,除非你在generics类型上指定约束。 例如,您可能需要指定它们都必须实现某个接口。 类型参数的约束(C#编程指南)描述了如何在C#中执行此操作。

编辑 :鉴于您修改过的问题,我认为Marco M.的答案是正确的(也就是说,我认为您应该使用当前尝试使用IDataAdapter接口的Converter委托。)

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

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

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

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

你最好使用像转换委托这样的东西

 public delegate TOutput Converter(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(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)); } 

这就是我所使用的(基于IEnumerable结构):

 public interface IDataAdapter { object Transform(object input); } public interface IDataAdapter : IDataAdapter { OutT Transform(InT input); } public class SomeClass : IDataAdapter { public string Transform(string input) { // Do something... } public object Transform(object input) { throw new NotImplementedException(); } } 

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

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

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