【问题标题】:Why can't I enumerate X509Store.Certificates为什么我不能枚举 X509Store.Certificates
【发布时间】:2019-03-24 19:29:50
【问题描述】:

考虑以下代码:

using (X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine))
{
    store.Open(OpenFlags.ReadOnly);

    foreach (var certificate in store.Certificates)
    {
        if (!string.IsNullOrWhiteSpace(certificate?.SubjectName?.Name) 
            && certificate.SubjectName.Name.StartsWith("CN=*.mysite.com"))
        {
            return certificate;
        }
    }
}

所以我可以清楚地遍历证书,但为什么我不能枚举它们。为什么下面的代码会抛出编译错误?

var cert = store.Certificates.FirstOrDefault(x =>
    string.IsNullOrWhiteSpace(x?.SubjectName?.Name) &&
    x.SubjectName.Name.StartsWith("CN=*.mysite.com"));

错误 CS1061“X509Certificate2Collection”不包含“FirstOrDefault”的定义,并且找不到接受“X509Certificate2Collection”类型的第一个参数的可访问扩展方法“FirstOrDefault”(您是否缺少 using 指令或程序集引用?)

【问题讨论】:

  • X509Certificate2Collection 实现System.Collections.IList(注意缺少的通用说明符),使用Certificates.OfType<X509Certificate2>().FirstOrDefault(...)

标签: c# linq


【解决方案1】:

你应该强制转换它才能使用它:

store.Certificates.OfType<X509Certificate2>().FirstOrDefault(x =>
    string.IsNullOrWhiteSpace(x?.SubjectName?.Name) &&
    x.SubjectName.Name.StartsWith("CN=*.mysite.com"));

store.Certificates.Cast&lt;X509Certificate2&gt;() 会给你一个IEnumerable&lt;X509Certificate2&gt;,这是你需要的。

【讨论】:

  • 我建议在过滤后应用演员表。
  • 这行得通,但为什么 GetEnumerator() 在这里不起作用?它存在
猜你喜欢
  • 1970-01-01
  • 2018-10-25
  • 2010-10-09
  • 1970-01-01
  • 2014-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多