Прежде всего, я бы порекомендовал запустить этот код в отладчике и повернуть один «Break on Exception» , чтобы помочь определить, какая строка вызывает ошибку. Это полезный метод отладки, который поможет вам быстрее находить подобные проблемы в будущем. Перейдите к Debug >> Exceptions
в VS и установите флажок для Common Language Runtime Exceptions
в столбце Thrown
.
Теперь к вашей проблеме. Вероятно, что sender
передается как null
. Если это так, строка:
Type foo = Type.GetType(sender.GetType().ToString());
бросит NullReferenceException
. Вместо этого вы можете использовать:
Type foo = typeof(T);
, который определяет тип общего параметра, не требуя его экземпляра.
Теперь, не зная больше о том, что пытается сделать ваш код, невозможно сказать, является ли создание экземпляра T
правильным решением. То, что ReSharper рекомендует добавлять where T : new()
, не означает, что это уместно - если вы не знаете , что это правильное поведение .
Наконец, я не знаю, есть ли веская причина для использования отражения для вызова MethodInOtherClass
- возможно, есть. Но так как вы новичок в C #, я упомяну, что если тип T
всегда будет подклассом некоторого базового типа A
или всегда будет реализовывать некоторый интерфейс I
, который включает метод, который вы хотите вызвать, Вы можете просто применить общее ограничение, чтобы компилятор знал это. Затем вы можете вызвать метод, не возвращаясь к использованию отражения:
public void UpdateRecords<T>(T sender)
where T : SomeBaseClass_Or_SomeInterface_ThatDefinesMethod
{
sender = new T();
sender.MethodInOtherClass( x, y );
}
Намного приятнее.
Один последний комментарий. Необычно передать аргумент методу, а затем полностью его игнорировать - только для создания экземпляра в методе. Есть случаи, когда это уместно - но я склонен рассматривать это как запах кода . Если возможно, я бы попытался либо избавиться от аргумента sender
, либо изменить код, чтобы сначала проверить его на нулевое значение, а создать его только тогда.