2010-08-09 31 views
18

Tôi bị kẹt.Chuyển đổi Hành động <T> thành Hành động <object>

Làm cách nào để chuyển đổi Action<T> to an Action<Object> trong C#?

Trân Magnus

+5

Câu hỏi không có ý nghĩa, bạn không thể tạo hành động , bạn phải chỉ định loại. –

+1

Đoán câu hỏi này trong câu hỏi hiệp phương sai/đối ứng, nếu không câu trả lời sẽ chỉ là 'Hành động '. –

+2

Bạn không thể bỏ một kiểu generic chung cho một đối tượng, trừ khi T bị giới hạn trong lớp. Trong mã, Hành động được gán cho Hành động là hợp pháp khi T: lớp. Steven, chỉ để làm rõ điều này không phải là có thể giải quyết bằng hiệp phương sai. – Dykam

Trả lời

34

Dưới đây là một ví dụ về những gì bạn yêu cầu (loại kiểm tra có thể được thêm vào trong dòng cuối cùng để xử lý đúng đắn ngoại lệ cast không hợp lệ để có nhiều người dùng thân thiện):

public Action<object> Convert<T>(Action<T> myActionT) 
{ 
    if (myActionT == null) return null; 
    else return new Action<object>(o => myActionT((T)o)); 
} 

Có thể bạn có thể cho biết thêm chi tiết về công việc mặc dù, bởi vì ngay bây giờ có vẻ hơi lạ.

+0

Cảm ơn tôi sẽ kiểm tra sau. –

+0

Nó hoạt động. Cảm ơn. :-) – Fanda

+1

wow đáng kinh ngạc. Cảm ơn bro: D – brian

0

Không chắc chắn những gì bạn có nghĩa là bằng cách chuyển đổi ... Hành động là tuyên bố chung của một đại biểu hành động ... nếu bạn muốn một đại biểu hành động mà hoạt động trên 'đối tượng' bạn sẽ làm điều gì đó như :

var myAction = new Action<object>(obj=> ...); 
0

tôi giả sử bạn có một cái gì đó như thế này:

void Foo(Action<object> action) { } 

Action<something> myaction; 

Và muốn chuyển đổi MyAction để bạn có thể vượt qua nó để Foo.

Điều đó không hiệu quả.

Foo có thể chuyển bất kỳ đối tượng nào đến hành động có loại xuất phát từ đối tượng. Nhưng myaction chỉ chấp nhận các đối tượng xuất phát từ một cái gì đó.

0

Tôi đang tìm cách để thực hiện việc này ngay hôm nay và tình cờ gặp bài đăng này. Thực sự, cách đơn giản nhất mà tôi tìm thấy là làm theo cách hành động < chuỗi > trong một đối tượng Hành động < mới >. Trong trường hợp của tôi, tôi đã đẩy hành động của tôi vào một từ điển đồng thời, và sau đó lấy chúng theo loại. Có hiệu quả, tôi đã xử lý một hàng đợi các thông điệp nơi các hành động có thể được định nghĩa để xử lý các thông điệp với một đầu vào được nhập cụ thể.

var _actions = new ConcurrentDictionary<Type, Action<object>>(); 
Action<string> actionStr = s => Console.WriteLine(s); 
var actionObj = new Action<object>(obj => { var castObj = (V)Convert.ChangeType(obj, typeof(V)); actionStr(castObj); }); 
_actions.TryAdd(typeof(string), actionObj); 
Các vấn đề liên quan