2013-03-18 45 views
6

Có một số vấn đề trong việc thực hiện ràng buộc chung này.Xác định ràng buộc loại giao diện chung cho giá trị và loại tham chiếu

Tôi có hai giao diện bên dưới.

Tôi muốn có thể hạn chế loại ICommandHandlers TResult để chỉ sử dụng các loại thực hiện ICommandResult, nhưng ICommandResult có các ràng buộc riêng của nó cần được cung cấp. ICommandResult có khả năng trả về một giá trị hoặc kiểu tham chiếu từ thuộc tính Result của nó. Tôi có thiếu một cái gì đó hiển nhiên? Cảm ơn.

public interface ICommandResult<out TResult> 
{ 
    TResult Result { get; } 
} 

public interface ICommandHandler<in TCommand, TResult> where TCommand : ICommand 
                 where TResult : ICommandResult<????> 
{ 
    TResult Execute(TCommand command); 
} 
+0

Tôi không thấy điều này liên quan đến kiểu tham chiếu và kiểu giá trị –

+0

Thuộc tính ICommandResult Result có thể là giá trị hoặc kiểu tham chiếu. – Matt

+0

Vì vậy, có thể loại bất kỳ kiểu generic nào khác trừ khi bị ràng buộc với "where T: class/struct" ? –

Trả lời

1

Bạn có thể thay đổi giao diện của bạn này (có vẻ loại sạch với tôi):

public interface ICommandHandler<in TCommand, TResult> where TCommand : ICommand 
{ 
    ICommandResult<TResult> Execute(TCommand command); 
} 

Hoặc bạn có thể thêm các tham số kiểu của ICommandResult<TResult> vào danh sách thông số chung của bạn:

public interface ICommandHandler<in TCommand, TCommandResult, TResult> 
    where TCommand : ICommand 
    where TCommandResult: ICommandResult<TResult> 
{ 
    TCommandResult Execute(TCommand command); 
} 
+0

Cảm ơn, tôi nghĩ rằng lựa chọn đầu tiên của bạn là thanh lịch nhất. – Matt

0

Bạn có thể thêm một tham số kiểu generic thứ 3 để ICommandHandler:

public interface ICommandResult<out TResult> 
{ 
    TResult Result { get; } 
} 

public interface ICommandHandler<in TCommand, TResult, TResultType> 
                 where TCommand : ICommand 
                 where TResult : ICommandResult<TResultType> 
{ 
    TResult Execute(TCommand command); 
} 
0

Hmm không nên nhìn giao diện thứ hai của bạn nhiều như thế này?

public interface ICommandHandler<in TCommand, ICommandResult<TResult>> 
    where TCommand : ICommand 
{ 
    TResult Execute(TCommand command); 
} 
+0

'out' ở đó? Tôi tin rằng điều này là không thể! –

+0

Đây là phần tôi không chắc chắn. Tôi hiện đang làm việc với .Net 3.5 ... Tôi sẽ xóa nó. – DHN

+0

Bạn có thể xác định rằng một tham số là contravariant trong định nghĩa giao diện: D –

0

này nên làm điều đó:

public interface ICommandHandler<in TCommand, out TResult> 
    where TCommand : ICommand 
    where TResult : ICommandResult<TResult> 
{ 
    TResult Execute(TCommand command); 
} 
Các vấn đề liên quan