使用C#中的"Type"对象键入转换对象

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"的原因.

Jef*_*nal 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);
Run Code Online (Sandbox Code Playgroud)

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

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

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


sha*_*esh 7

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

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)