2009-09-03 134 views
11

迄今爲止,這個對我來說證明是有點棘手。我想知道是否可以使用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(); 

以上是一個通用的接口,這就是爲什麼我使用「對象」的類型。

回答

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

我在示例中沒有使它清楚,但是這兩種方法在IDataAdapter接口中。 – Ryall 2009-09-03 16:31:36

+0

再次感謝傑夫。 – Ryall 2009-09-03 16:37:20

+0

沒問題,我再次更新了我的答案。 – 2009-09-03 16:58:55

2

的以上是一個通用的接口,這就是爲什麼我使用「對象」的類型

,豈不更有意義使用一個實際的通用接口:

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

    return output; 
} 

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

這些看起來像C++中的模板 - 實際上還沒有在C#中涵蓋它們。謝謝! – Ryall 2009-09-03 16:24:27

+0

我對你如何在泛型之外使用'U'有點困惑。你給了什麼範圍? – Ryall 2009-09-03 16:25:44

+0

@Kelix:「U」是你的實際類型,你不會真的使用那樣的「U」。看@ Jeff的回答,並注意他的T2被替換爲「string」並以相同的方式進行匹配。 – 2009-09-03 16:34:29

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)); 
} 
+0

這是如何讓Type對象轉換另一個對象的? TInput和TOutput不是對象,需要在編譯時知道。 – Despertar 2012-02-18 23:16:12

7

爲什麼讓它複雜,當你確信它返回一個字符串?

var output = t.Transform(input) as string; 

如果我誤解你說的話,這裏是另一種方式

var output = Convert.ChangeType(t.Transform(input), t.GetOutputType()); 
+1

因爲這個例子是一個接口 - 現在正在更新。 – Ryall 2009-09-03 16:32:48

+0

更新,感謝您的回答。 – Ryall 2009-09-03 16:36:25

+0

我會爲此打1!我喜歡''Convert.ChangeType()''的想法,並提供對象的類型作爲第二個參數,所以它將被改變爲該類型。我正在另一個圖書館工作,希望這會挽救我的夜晚。謝謝@shahkalpesh – 2015-08-25 14:15:04

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(); 
    } 
} 
相關問題