2010-03-19 2 views
3

У меня есть код, который выглядит как:Конструктор invocation возвращен null: что делать?

private static DirectiveNode CreateInstance(Type nodeType, DirectiveInfo info) { 
    var ctor = nodeType.GetConstructor(new[] { typeof(DirectiveInfo) }); 

    if(ctor == null) { 
     throw new MissingMethodException(nodeType.FullName, "ctor"); 
    } 

    var node = ctor.Invoke(new[] { info }) as DirectiveNode; 

    if(node == null) { 
     // ???; 
    } 

    return node; 
} 

Я ищу что делать (например, какой тип исключения бросить), когда метод Invoke возвращает то, что не является DirectiveNode или когда он возвращает null (указанном // ??? выше).

(договор метода, nodeType всегда описывает подкласс DirectiveNode.)

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

ответ

5

Вы должны убедиться, что nodeType является DirectiveNode:

if (!typeof(DirectiveNode).IsAssignableFrom(nodeType)) 
    throw new ArgumentException("The specified node type is not a 'DirectiveNode'"); 

Кроме того, вы можете (должны) использовать Activator.CreateInstance вместо того, чтобы вручную найти ConstructorInfo и ссылающегося на него. Это чище, выразительнее и удобнее.

+0

Вау, я не знал о 'Activator.CreateInstance'. Благодарю. По моему контракту я уверен, что для функции отправляется только подкласс «DirectiveNode», так что это не проблема. В любом случае, спасибо. =] – strager

+0

Вы останавливаете отладчик и проверяете? Просто потому, что это кажется невозможным, это не значит, что это невозможно. – snarf

+0

'as' никогда не возвращал' null'. Я спрашивал, пытаюсь ли я что-то делать, если это так, потому что это выглядит как невозможное условие. – strager

Смежные вопросы