Ví dụ sau đây cho thấy Type.GetType thất bại trong một trường hợp cụ thể.Loại.GetType không thành công khi được gọi là nhóm phương thức nhưng không có trong biểu thức lambda
GetType thành công khi tôi cung cấp chuỗi tên lớp (bao gồm cả không gian tên) trong biểu thức lambda, nhưng không thành công khi tôi chỉ định lệnh gọi GetType làm nhóm phương thức.
Thất bại:
collectionOfClassNames.Select(GetType)
Thành Công:
collectionOfClassNames.Select(s => GetType(s))
Cả hai phương pháp thành công khi đường dẫn lớp bao gồm tên lắp ráp. Tôi nghi ngờ đó là một cái gì đó để làm với bối cảnh hiện tại/phạm vi cho IL tạo ra cho ở trên. Tôi có thể thấy sự khác biệt trong IL nhưng tôi vẫn không thể giải thích nguyên nhân chính xác.
Dưới đây là ví dụ chạy được thể hiện sự cố.
using System;
using System.Linq;
using System.Reflection;
namespace GetTypeTest
{
public class FindMe{}
class Program
{
static void Main(string[] args)
{
var assemblyName = Assembly.GetExecutingAssembly().FullName;
var className = "GetTypeTest.FindMe";
var classAndAssembly = string.Format("{0}, {1}", className, assemblyName);
// 1) GetType succeeds when input is "class, assembly", using method group
var result = new[] { classAndAssembly }.Select(Type.GetType).ToArray();
Console.WriteLine("1) Method group & class+assembly: {0}", result.First());
// 2) GetType fails when input is just the class name, using method group
var result2 = new[] { className }.Select(Type.GetType).ToArray();
Console.WriteLine("2) Method group & class name only: {0}", result2.First());
// 3) Identical to (2) except using lamba expression - this succeeds...
var result3 = new[] { className }.Select(s => Type.GetType(s)).ToArray();
Console.WriteLine("3) Lambda expression & class name only: {0}", result3.First());
// 4) Method group and core type class name
var result4 = new[] { "System.String" }.Select(Type.GetType).ToArray();
Console.WriteLine("4) Method group for System.String: {0}", result4.First());
Console.ReadLine();
}
}
}
Tôi muốn biết lý do tại sao # 2 thất bại nhưng # 3 thành công.
này nghe có vẻ đúng. Thường sử dụng ['Assembly.GetType (string)'] (http://msdn.microsoft.com/en-us/library/y0cd10tb.aspx) để thay thế. Ví dụ với 'var assem = typeof (Program) .Assembly;', không có vấn đề gì khi sử dụng 'stringColl.Select (assem.GetType)'. –
@JeppeStigNielsen Yup, Đúng vậy, chúng tôi cần sử dụng tên đủ điều kiện. BTW báo cáo của tôi là chính xác. Cập nhật câu trả lời của tôi với bằng chứng :) –
Sử dụng hội đồng gọi là đầu vào cho một phương pháp là thiết kế API ghê tởm trên một phần của BCL. – usr