Reflection.Assembly.CreateInstance (строка) - PullRequest
1 голос
/ 03 ноября 2011

В .NET 4.0, если у меня есть следующий код:

....
T instantiatedClass;
try
{
    instantiatedClass = (T)assembly.CreateInstance(classFullName);
}
catch (Exception ex)
{
    errMsg = string.Format("Error creating an instance of type \"{0}\".", classes.First().FullName);
    throw new ApplicationException(errMsg, ex);
}

Предполагая, что classFullName является правильным типом в сборке, и что тип "T" реализует открытый интерфейс, есть ли обстоятельства, при которых 1) не будет выдано исключение, и 2) instantiatedClass будет иметь значение null?

Спасибо за любую помощь.

Ответы [ 2 ]

4 голосов
/ 03 ноября 2011

Исходя из ваших предположений, и если ваш тип T всегда является интерфейсом, то прямое приведение к T сгенерирует исключение, если рассматриваемый интерфейс не реализован созданным экземпляром или если тип не имеет конструктора по умолчанию, который может быть названным.

Лучшим подходом, позволяющим избежать исключения, было бы ...

T interfaceVar = assembly.CreateInstance(classFullName) as T;
if (interfaceVar == null)
{
    // oops, does not implement interface T
}
else
{
    // yippee, it does implement interface T
}

Вы можете использовать отражение в целевой сборке, чтобы проверить, существует ли требуемый тип, имеет ли он конструктор по умолчанию и реализует ли он интересующий вас интерфейс. В этом случае вам вообще не нужно создавать экземпляр, если все Вы хотите знать, имеет ли он указанный интерфейс.

1 голос
/ 03 ноября 2011

Если конструктор по умолчанию отсутствует или предположение, что classFullName является допустимым в сборке, неверно или что-либо препятствует вызову CreateInstance вызвать конструктор, выдается исключение.

Таким образом, единственный способ, которым это может потерпеть неудачу, - это если вызываемый конструктор возвращает нулевое значение. Но это не может произойти, так как если во время конструирования не возникает исключение, то вызов конструктора вернет ссылку на новый объект, и если возникнет исключение, вы его поймаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...