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