Rya*_*all 10 c# reflection boxing types casting
到目前为止,这个对我来说有点棘手.我想知道是否可以使用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();
Run Code Online (Sandbox Code Playgroud)
以上是一个通用接口,这就是我为类型使用"object"的原因.
这样做的典型方法是使用泛型,如下所示:
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);
Run Code Online (Sandbox Code Playgroud)
正如您在下面的评论中提到的,泛型与C++模板非常相似.您可以在此处找到Generics的MSDN文档,文章" C++模板与C#Generics之间的差异(C#编程指南) "可能会有所帮助.
最后,我可能误解了你想在方法体内做什么:我不确定如何将任意类型T转换为另一种任意类型T2,除非你在泛型类型上指定约束.例如,您可能需要指定它们都必须实现某个接口.类型参数的约束(C#编程指南)描述了如何在C#中执行此操作.
编辑:鉴于您修改过的问题,我认为Marco M.的答案是正确的(也就是说,我认为您应该使用Converter当前尝试使用您的IDataAdapter界面的代理.)
当你确定它返回一个字符串时,为什么要使它变得复杂?
var output = t.Transform(input) as string;
Run Code Online (Sandbox Code Playgroud)
如果我误解了你在说什么,这里还有一个方法
var output = Convert.ChangeType(t.Transform(input), t.GetOutputType());
Run Code Online (Sandbox Code Playgroud)