Хорошо, моя проблема была в этом: я реализовал IList<T>
. Когда я добрался до CopyTo(Array array, int index)
, это было мое решение:Правильная проверка типа NULL в C#?
void ICollection.CopyTo(Array array, int index)
{
// Bounds checking, etc here.
if (!(array.GetValue(0) is T))
throw new ArgumentException("Cannot cast to this type of Array.");
// Handle copying here.
}
Это работало в моем исходном коде, и до сих пор работает. Но у него есть небольшой недостаток, который не подвергается, пока я не начал строить тесты для него, в частности это:
public void CopyToObjectArray()
{
ICollection coll = (ICollection)_list;
string[] testArray = new string[6];
coll.CopyTo(testArray, 2);
}
Теперь этот тест должен пройти. Он бросает ArgumentException
о невозможности броска. Зачем? array[0] == null
. Ключ is
всегда возвращает false при проверке переменной, которая установлена в null
. Теперь, это удобно для всех видов причин, в том числе избегая пустых разыменовывает и т.д. То, что я наконец-то придумал для моей проверки типа был такой:
try
{
T test = (T)array.GetValue(0);
}
catch (InvalidCastException ex)
{
throw new ArgumentException("Cannot cast to this type of Array.", ex);
}
Это не совсем элегантно, но он работает .. Есть ли лучший способ?
Использование отражения, безусловно, будет дороже, чем просто для недействительного актера. – 2008-10-04 02:19:20
+1 для усилий и решения, которое работает. Производительность мудрая, хотя, я думаю, мне приходится сражаться с ffpf, Reflection, вероятно, идет по длинному маршруту. – 2008-10-04 02:24:10
Думая об этом (и имея умственную пощечину), я думаю, что это, вероятно, единственный способ сделать это правильно. – 2008-10-04 02:32:01