Tôi có một dll chứa một số lớp mà tất cả đều được kế thừa từ một lớp CommandBase. Tôi đang cố gắng để có được trường hợp của tất cả các lớp này (CommandA, CommandB, CommandC, vv ...) bằng cách sử dụng phản ánh trong C# để tôi có thể gọi một phương pháp cụ thể trên mỗi một. Dưới đây là những gì tôi có cho đến thời điểm này:Sử dụng sự phản chiếu để có được tất cả các lớp của một kiểu cơ sở nhất định trong dll
//get assemblies in directory.
string folder = Path.Combine(HttpContext.Current.Server.MapPath("~/"), "bin");
var files = Directory.GetFiles(folder, "*.dll");
//load each assembly.
foreach (string file in files)
{
var assembly = Assembly.LoadFile(file);
if (assembly.FullName == "MyCommandProject")
{
foreach (var type in assembly.GetTypes())
{
if (!type.IsClass || type.IsNotPublic) continue;
if(type is CommandBase)
{
var command = Activator.CreateInstance(type) as CommandBase;
}
}
}
}
Tôi đang gặp phải 2 vấn đề. Vấn đề thứ nhất là dòng "if (type is CommandBase") đưa ra cảnh báo sau:
Biểu thức đã cho không bao giờ được cung cấp Loại CommandBase.
Vấn đề thứ hai là tôi không thể tìm ra cách để có được một thể hiện của đối tượng thực tế (CommandA, CommandB, vv ...), chỉ cần chuyển đổi nó sang CommandBase là không đủ.
Dòng cuối cùng của bạn không tạo đúng trường hợp? 'Với Activator.CreateInstance()', bạn nên có một thể hiện của CommandA, CommandB ... lớp (tùy thuộc vào 'loại'), không? –
Activation.CreateInstance() trả về đối tượng kiểu. – Justin
Có nhưng nó trả về một đối tượng thuộc loại bạn đã cung cấp. Bạn có thể lưu trữ nó trong một "đối tượng" var hoặc một "CommandBase" var, nó vẫn sẽ là một CommandA, CommandB, vv dụ. Bạn có thể truyền sau này thành loại "thực". Tôi không có Visual Studio để kiểm tra nhưng tôi không thấy vấn đề là gì. –