2011-12-18 4 views
0

У меня есть свойство X509Certificate2, и я хочу проверить раздел набора, если значение, которое было установлено, пуст. Когда я пытаюсь получить доступ к любому объекту X509Certificate2, например publicickey, я получил это исключение: System.Security.Cryptography.CryptographicException произошло в mscorlib.dll.Элегантный способ проверить, нет ли объекта .Net

уверен, что я могу написать что-то такое в этом примере:

private static X509Certificate2 _certificate; 

    public X509Certificate2 Certificate 
    { 
     get 
     { 
      return _certificate; 
     } 
     set 
     { 
      try 
      { 
       if (value.PublicKey != null) 
        _certificate = value; 
      } 
      catch(CryptographicException) 
      { 
       _certificate = null; 
      } 

     } 
    } 

, но я хочу более хороший путь, какая-либо одна есть идея?

+4

Что такое исключение? – SLaks

+0

Это ничего, что можно сделать универсально для * каждого * объекта. Это зависит от базового типа – yas4891

+0

Вы уверены, что 'значение' не равно нулю? – Groo

ответ

-1

Вы можете использовать null coalescing operator:

public X509Certificate2 Certificate  
{ 
    get { return _certificate; } 
    set { _certificate = value.PublicKey ?? null; } 
} 

В основном:

_certificate = value.PublicKey оно не равно нулю, в противном случае он равен нулю.

Но теперь пишу это, я думаю, что не будет работать, так что, возможно, потребуется использовать ternary:

public X509Certificate2 Certificate  
{ 
    get { return _certificate; } 
    set { _certificate = value == null ? null : value.PublicKey; } 
} 

Что означает:

_certificates = нуль, если значение равно нулю, иначе он равен значению. PublicKey

Я думаю, что это правильный подход, так как ваша ценность null приведет к исключению.

+0

if - as OP states - вызов value.PublicKey генерирует исключение, это не улучшит ситуацию – yas4891

+5

Я не думаю, что вы понимаете проблему.Свойство 'PublicKey' будет вызывать' CryptographicException' в '' getter'', если оно находится в недопустимом состоянии. Это его проблема. – Marc

0

MSDN сказал: «Значение ключа не является RSA или DSA-ключом, или ключ нечитабелен». Так что, может быть, ваш алгоритм не RSA или DSA. Проверьте, что возвращает GetKeyAlgorithm()

0

Вы можете использовать простой вариант - получить доступ к свойству Handle:

public X509Certificate2 Cretificate 
{ 
    get { return _certificate; } 
    set { _certificate = value.Handle == IntPtr.Zero ? null : value} 
} 

, как я знаю, в противном случае, когда вы определяете:

X509Certificate2 cert = new X509Certificate2(); 

и будет пытаться установить ваш сертификат с пустым сертификатом - вы можете получить исключение.

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