2010-08-04 30 views
10

Tôi có một tập hợp các đối tượng mà tôi truyền làm tham số để tạo các đối tượng thuộc loại khác (một cho một). Tôi đang làm điều này ở nhiều nơi (về cơ bản chuyển đổi từ các đối tượng dữ liệu sang các đối tượng kinh doanh). Tôi muốn viết một phương pháp mở rộng chung để thực hiện điều này. Nhưng tôi bị mắc kẹt bởi vì tôi không biết làm thế nào tôi có thể xác định ràng buộc rằng đối tượng kinh doanh có một nhà xây dựng lấy đối tượng dữ liệu làm tham số. Sau đây là mã chức năng của tôi:Chỉ định ràng buộc của hàm tạo cho Tham số chung

public static IList<T> ConvertTo<A,T>(this IEnumerable<A> list) 
        where T : new(A)/*THIS IS PROBLEM PART*/ 
{ 
    var ret = new List<T>(); 

    foreach (var item in list) 
    { 
     ret.Add(new T(item)); 
    } 
    return ret; 
} 

Trả lời

13

Thật không may, điều này không được phép trong C#. Bạn có thể có ràng buộc new() buộc loại phải có hàm tạo mặc định, nhưng đó là ràng buộc liên quan đến hàm tạo duy nhất được .NET hỗ trợ.

Tùy chọn tốt nhất của bạn có thể là xác định giao diện bạn có thể sử dụng và hạn chế giao diện. Thay vì cố gắng đặt đối tượng lúc xây dựng, bạn có thể có phương thức kiểu "Khởi tạo" lấy đối tượng "A" và gọi đó.

+0

Có cách giao diện đẹp và tôi có thể sử dụng nó vì tôi đang sử dụng mẫu T4 để tạo BO vì vậy sẽ không quá nhiều công việc. – TheVillageIdiot

3

Bạn không thể chế nhà xây dựng kiểu chung chung theo cách này (chỉ yêu cầu một constructor parameterless), nhưng bạn có thể mất một đại biểu làm việc xây dựng:

public static IList<T> ConvertTo<A, T>(this IEnumerable<A> list, Func<A, T> constructionFunc) 
{ 
    return list.Select(constructionFunc).ToList(); 
} 

Và sử dụng nó như thế này:

var IList<T> converted = someSequence.ConvertTo(a => new T(a)); 
+0

bất kỳ ví dụ về tham số chức năng nào? Tôi nên xác định nó ở đâu trong lớp T? – TheVillageIdiot

Các vấn đề liên quan