Ich dachte, ich würde Martijns Antwort und Svicks Antwort vergleichen ...
Das folgende Programm gibt die folgenden Ergebnisse zurück:
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"));
}
Daher würde ich vorschlagen, Reflexion zu verwenden. Siehe unten.
Auf Blands Kommentar antworten:
Verhältnisse sind reflection:exception
Ticks für 100000 Iterationen:
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
... fair genug - wenn Sie erwarten, dass es mit einer Wahrscheinlichkeit von weniger als ~ 1/47 fehlschlägt, dann gehen Sie zur Ausnahme.
Das oben Gesagte setzt voraus, dass Sie GetProperties()
jedes Mal laufen . Möglicherweise können Sie den Prozess beschleunigen, indem Sie das Ergebnis GetProperties()
für jeden Typ in einem Wörterbuch oder ähnlichem zwischenspeichern. Dies kann hilfreich sein, wenn Sie immer wieder mit denselben Typen vergleichen.