Đây là "loại" có thể. Sắp xếp trong đó bạn có thể làm điều đó, nhưng nó là một chút của một hack.
Bạn có 3 tùy chọn:
Nếu bạn biết lớp học của mình ở phía trước, hãy sử dụng câu lệnh chuyển đổi. Về cơ bản như thế này:
switch(str){
case "TypeRepository": return new Repository<TypeRepository>;
}
Như một hình thức tiên tiến hơn những điều trên, bạn có thể sử dụng một từ điển thay vì một Hashtable
var factory = new Dictionary<string, Func<object>>();
factory.Add("TypeRepository",() => new Repository<TypeRepository>());
var theObject = factory["TypeRepository"]() as Repository<TypeRepository>;
Đối với sự linh hoạt lớn nhất, Bạn có thể sử dụng phản ánh để phù hợp với chuỗi đến các lớp học trong thời gian chạy. Hãy nhận biết rằng sự phản chiếu khá chậm, vì vậy nếu bạn đang làm điều này với bất kỳ loại nào đều đặn, bạn muốn tránh nó. Ví dụ: Dưới đây là một phương thức sử dụng phương thức Frans Bouma's. Chỉ cần thay đổi List<>
để Repository<>
trong mã của bạn:
public static object MakeList(string typeStr)
{
var nameSpace = "MyTestApplication" + ".";
var objType = Type.GetType(nameSpace + typeStr); // NAMESPACE IS REQUIRED
var listType = typeof(List<>).MakeGenericType(objType);
return Activator.CreateInstance(listType);
}
var listOfThings = MakeList("MyCoolObject") as List<MyCoolObject>;
Lưu ý: Không có cách nào để tránh thực tế là tất cả các cơ chế này trở object
, mà sau đó bạn phải bỏ để loại thích hợp của bạn, thay vì trở về Chỉ cần trả lại gõ mạnh giá trị. Điều này là không thể tránh khỏi, bởi vì bạn không biết loại danh sách cho đến khi chạy, và C# được xây dựng xung quanh việc biết mọi thứ tại thời gian biên dịch (đây là ý nghĩa của mọi người khi họ nói "ngôn ngữ lập trình tĩnh"). Nó sẽ ít đau đớn hơn trong C# 4, nơi bạn sẽ có thể quay trở lại dynamic
, điều này sẽ giúp bạn tiết kiệm quá trình truyền.
Nguồn
2009-03-26 20:10:02
Lưu ý rằng bạn không thể tham chiếu đến Kho lưu trữ trong chương trình của bạn, do đó, loại _rep sẽ phải là 'đối tượng' hoặc một số giao diện chung cho tất cả Kho lưu trữ . –