Tôi nghĩ tôi sẽ làm một phép so sánh câu trả lời của Martijn và câu trả lời của Svick ...
Chương trình sau đây trả về kết quả sau:
Testing with exception: 2430985 ticks
Testing with reflection: 155570 ticks
void Main()
{
var random = new Random(Environment.TickCount);
dynamic test = new Test();
var sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 100000; i++)
{
TestWithException(test, FlipCoin(random));
}
sw.Stop();
Console.WriteLine("Testing with exception: " + sw.ElapsedTicks.ToString() + " ticks");
sw.Restart();
for (int i = 0; i < 100000; i++)
{
TestWithReflection(test, FlipCoin(random));
}
sw.Stop();
Console.WriteLine("Testing with reflection: " + sw.ElapsedTicks.ToString() + " ticks");
}
class Test
{
public bool Exists { get { return true; } }
}
bool FlipCoin(Random random)
{
return random.Next(2) == 0;
}
bool TestWithException(dynamic d, bool useExisting)
{
try
{
bool result = useExisting ? d.Exists : d.DoesntExist;
return true;
}
catch (Exception)
{
return false;
}
}
bool TestWithReflection(dynamic d, bool useExisting)
{
Type type = d.GetType();
return type.GetProperties().Any(p => p.Name.Equals(useExisting ? "Exists" : "DoesntExist"));
}
Kết quả là tôi đề nghị sử dụng sự phản chiếu. Xem bên dưới.
Trả lời bình luận nhạt nhẽo:
Tỷ lệ được đánh reflection:exception
dấu cho 100000 lần lặp:
Fails 1/1: - 1:43 ticks
Fails 1/2: - 1:22 ticks
Fails 1/3: - 1:14 ticks
Fails 1/5: - 1:9 ticks
Fails 1/7: - 1:7 ticks
Fails 1/13: - 1:4 ticks
Fails 1/17: - 1:3 ticks
Fails 1/23: - 1:2 ticks
...
Fails 1/43: - 1:2 ticks
Fails 1/47: - 1:1 ticks
... đủ công bằng - nếu bạn dự đoán nó sẽ thất bại với xác suất có ít hơn ~ 1/47, thì hãy đi ngoại lệ.
Ở trên giả định rằng bạn đang chạy GetProperties()
mỗi lần. Bạn có thể tăng tốc quá trình bằng cách lưu trữ kết quả của GetProperties()
từng loại trong từ điển hoặc tương tự. Điều này có thể hữu ích nếu bạn kiểm tra cùng một nhóm các loại nhiều lần.