Trong kiến trúc plugin của tôi, tôi hiện đang truyền một tên plugin (chuỗi), tên phương thức (chuỗi) và tham số (mảng đối tượng) vào dịch vụ plugin của tôi để thực thi phương thức đã chỉ định và trả về kết quả (của gõ T).Chuyển kiểu ẩn danh làm tham số phương thức
phương thức execute Các dịch vụ Plugin có thể được nhìn thấy dưới đây:
public TResult Execute<TResult>(string pluginName, string operation, params object[] input) {
MethodInfo method = null;
TResult result = default(TResult);
var plugin = _plugins.Enabled().FirstOrDefault(x => x.GetType().Name.Equals(pluginName, StringComparison.InvariantCultureIgnoreCase));
if (plugin != null) {
method = plugin.GetType().GetMethods().FirstOrDefault(x => x.Name == operation);
if (method != null) {
result = (TResult)method.Invoke(plugin, input);
}
}
return result;
}
Một cách sử dụng ví dụ:
var url = AppHelper.PluginService.Execute<string>(
"ImagePlugin",
"GetImageUrl",
new object[] { image, size });
Những gì tôi thà làm là vượt qua trong một loại vô danh thay vì (như tôi nghĩ rằng đây là dễ đọc hơn) tức là
var url = AppHelper.PluginService.Execute<string>(
"ImagePlugin",
"GetImageUrl",
new { image = image, targetSize = size });
Làm cách nào để thay đổi phương thức Execute để ánh xạ ype thuộc tính để tham số phương pháp plugin của tôi?
Tôi đã xem xét sử dụng loại động mới trong .net 4.0 nhưng tôi muốn xác định tham số của mình trên phương thức plugin thay vì chấp nhận một đối tượng động.
Cảm ơn Bến
[Cập nhật]
Sau khi xem qua mã nguồn ASP.NET MVC có vẻ như đủ đơn giản để kéo loại vô danh thành một cuốn từ điển đối tượng ví dụ RouteValueDictionary. Với sự trợ giúp của sự phản chiếu, biểu thức LINQ được tạo động. Mặc dù thực hiện tốt, tôi thực sự không muốn tất cả sự phức tạp thêm này.
Theo những nhận xét dưới đây, tôi có thể đạt được khả năng đọc chỉ bằng cách xác định các thông số inline của tôi (không cần khai báo mảng đối tượng):
var url = AppHelper.PluginService.Execute<string>("ImagePlugin", "GetImageUrl", image, size);
Vì bạn đang sử dụng từ khóa 'params', bạn có thể làm' hình ảnh, kích thước' thay vì 'đối tượng mới [] {image, size}'. Nó sẽ làm cho nó dễ đọc hơn, và vì các phương thức 'Invoke' chấp nhận mảng đối tượng, tôi sẽ để lại chữ ký phương thức như nó. – Necros