2009-09-03 37 views
11

Điều này đã chứng tỏ là một chút khó khăn đối với tôi cho đến nay. Tôi tự hỏi nếu nó có thể gõ đúc một đối tượng bằng cách sử dụng một đối tượng System.Type.Gõ một đối tượng bằng cách sử dụng đối tượng "Loại" trong C#

tôi đã minh họa dưới đây những gì tôi có nghĩa là:

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(); 

Trên đây là một giao diện chung đó là lý do tôi đang sử dụng "đối tượng" cho các loại.

Trả lời

8

Cách thông thường để làm điều đó là sử dụng Generics, như vậy:

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); 

Như bạn nêu trong bình luận của bạn dưới đây, Generics rất giống với C++ Templates. Bạn có thể tìm thấy MSDN documentation for Generics here và bài viết "Differences Between C++ Templates and C# Generics (C# Programming Guide)" có thể sẽ hữu ích. Cuối cùng, tôi có thể hiểu lầm những gì bạn muốn làm bên trong thân phương pháp: Tôi không chắc chắn làm thế nào bạn sẽ biến đổi một loại tùy ý T thành một loại tùy ý T2, trừ khi bạn chỉ định ràng buộc trên các kiểu chung. Ví dụ, bạn có thể cần phải xác định rằng cả hai đều phải thực hiện một số giao diện. Constraints on Type Parameters (C# Programming Guide) mô tả cách thực hiện việc này trong C#.

Sửa: Với câu hỏi sửa đổi của bạn, tôi nghĩ this answer from Marco M. là đúng (. Có nghĩa là, tôi nghĩ rằng bạn nên sử dụng Converter đại diện trong đó bạn đang cố gắng sử dụng giao diện IDataAdapter của bạn)

+1

tôi đã không làm cho nó rõ ràng trong ví dụ nhưng hai phương thức nằm trong một IDataAdapter giao diện. – Ryall

+0

Cảm ơn Jeff lần nữa. – Ryall

+0

Không vấn đề gì và tôi đã cập nhật lại câu trả lời của mình một lần nữa. –

2

Các trên đây là một giao diện chung đó là lý do tôi đang sử dụng "đối tượng" cho các loại

nó sẽ không có ý nghĩa hơn để sử dụng một giao diện chung thực tế:

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

    return output; 
} 

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

Những hình như mẫu từ C + + - đã không thực sự bao phủ chúng trong C# được nêu ra. Cảm ơn! – Ryall

+0

Tôi hơi bối rối về cách bạn đang sử dụng 'U' bên ngoài chung chung. Bạn đưa ra phạm vi nào? – Ryall

+0

@Kelix: "U" sẽ là loại thực tế của bạn, bạn sẽ không thực sự sử dụng "U" như thế.Nhìn vào câu trả lời của @ Jeff và nhận thấy T2 của anh ấy được thay thế bằng "chuỗi" và kết hợp theo cách tương tự. –

3

Bạn đang tốt hơn bằng cách sử dụng một cái gì đó giống như Chuyển đổi đại biểu

public delegate TOutput Converter<TInput, TOutput>(TInput input); 

cho một ví dụ, hãy kiểm tra 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

Làm thế nào điều này cho phép một đối tượng Loại bỏ một đối tượng khác? TInput và TOutput không phải là các đối tượng và cần được biết tại thời gian biên dịch. – Despertar

7

Tại sao làm cho nó phức tạp, khi bạn chắc chắn rằng nó sẽ trả về một chuỗi ?

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

Nếu tôi đã hiểu lầm những gì bạn đang nói, đây là một trong nhiều cách

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

Vì ví dụ là một giao diện - đang cập nhật ngay bây giờ. – Ryall

+0

Đã cập nhật, cảm ơn câu trả lời. – Ryall

+0

Tôi sẽ nhấn 1 cho điều này! Tôi thích ý tưởng của '' Convert.ChangeType() '' và cung cấp kiểu đối tượng như đối số thứ 2 để nó sẽ được thay đổi thành kiểu đó. Tôi đang làm việc trên một thư viện khác và hy vọng rằng điều này sẽ giúp tôi tiết kiệm được một đêm. Thanks @shahkalpesh –

2

Đây là những gì tôi đã đi với (dựa trên cấu trúc 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(); 
    } 
} 
Các vấn đề liên quan