簡體   English   中英

使用C#中的“Type”對象鍵入轉換對象

[英]Type Casting an Object using a “Type” Object in 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();

以上是一個通用接口,這就是我為類型使用“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);

正如您在下面的評論中提到的,泛型與C ++模板非常相似。 您可以在此處找到GenericsMSDN文檔 ,文章“ C ++模板與C#Generics之間的差異(C#編程指南) ”可能會有所幫助。

最后,我可能誤解了你想在方法體內做什么:我不確定如何將任意類型T轉換為另一個任意類型T2 ,除非你在泛型類型上指定約束。 例如,您可能需要指定它們都必須實現某個接口。 類型參數的約束(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, 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));
}

以上是一個通用接口,這就是我為類型使用“object”的原因

使用實際的通用接口是否更有意義:

public U Transform<T, U>(T input)
{
    string output;

    return output;
}

U output = t.Transform(input) as U;

這就是我所使用的(基於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();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM