类型使用C中的“类型”对象投射对象#
迄今为止,这个对我来说证明是有点棘手。我想知道是否可以使用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();
以上是一个通用的接口,这就是为什么我使用“对象”的类型。
做到这一点的典型方法是使用泛型,像这样:
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
接口)
的以上是一个通用的接口,这就是为什么我使用“对象”的类型
,岂不更有意义使用一个实际的通用接口:
public U Transform<T, U>(T input)
{
string output;
return output;
}
U output = t.Transform(input) as U;
你最好使用类似的转换委托
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));
}
这是如何让Type对象转换另一个对象的? TInput和TOutput不是对象,需要在编译时知道。 – Despertar 2012-02-18 23:16:12
为什么让它复杂,当你确信它返回一个字符串?
var output = t.Transform(input) as string;
如果我误解你说的话,这里是另一种方式
var output = Convert.ChangeType(t.Transform(input), t.GetOutputType());
这是我已经与(基于断了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();
}
}
我在示例中没有使它清楚,但是这两种方法在IDataAdapter接口中。 – Ryall 2009-09-03 16:31:36
再次感谢杰夫。 – Ryall 2009-09-03 16:37:20
没问题,我再次更新了我的答案。 – 2009-09-03 16:58:55