检查.Net对象是否为空的优雅方法

时间:2011-12-18 13:48:54

标签: c#

我有X509Certificate2属性,如果设置的值为空,我想检查set部分。 当我尝试访问任何X509Certificate2属性(如publickey)时,我遇到了以下异常: System.Security.Cryptography.CryptographicException发生了mscorlib.dll

当然,我可以写一些这样的例子:

private static X509Certificate2 _certificate;

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

        }
    } 

但我想要一个更好的方式,有没有人有想法?

3 个答案:

答案 0 :(得分:0)

MSDN说“密钥值不是RSA或DSA密钥,或密钥不可读”。所以也许你的算法不是RSA或DSA。检查返回GetKeyAlgorithm()

的内容

答案 1 :(得分:0)

您可以使用简单选项 - 访问Handle属性:

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

据我所知,否则当你定义:

X509Certificate2 cert = new X509Certificate2();

并尝试使用空证书设置证书 - 您可能会遇到异常。

答案 2 :(得分:-1)

您可以使用null coalescing operator

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

基本上:

  

_certificate = value.PublicKey它不是null,否则它等于null。

但现在写这篇文章,我觉得这样做不行,所以可能需要使用ternary

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

这意味着:

  

_certificates = null如果value为null,则它等于value.PublicKey

我认为这是正确的方法,因为您的值为null将导致异常。