【问题标题】:How to know a c# class is user defined class or c# assembly class如何知道一个c#类是用户定义类还是c#程序集类
【发布时间】:2014-09-07 05:53:33
【问题描述】:

我已经搜索过但不知道如何检查一个类是用户定义的类还是 c#.net 程序集类。请在这一点上帮助我。当我使用程序集时,我需要知道哪些类是用户定义的,哪些不是?我还需要知道类属性类型。

【问题讨论】:

  • ".NET 程序集类" = ? .NET 框架附带的类?带有通用 .NET 库的类(不包含在 .NET BCL/FCL 中)?不是我写的?
  • 我需要知道一个类是否是用户定义的。
  • 哪个用户定义?每个类都是由某人(或由此类人的自动请求)创建的。
  • 自定义类或未由 .net 框架定义。
  • 如果没有随核心 .NET Framework 一起提供的(例如)EF 中的类呢?

标签: c#


【解决方案1】:

尝试按 F12,然后检查类定义。也许会有所帮助。

【讨论】:

  • 你错了。我正在编写代码,为什么要按 F12。
【解决方案2】:

不是很清楚你的意思,但如果你检查一下

yourObj.GetType().Assembly.Location

(或.CodeBase)你会得到一个提示。您需要将字符串与预期位置进行匹配。

也可以使用属性,例如:

var compAttr = yourObj.GetType().Assembly
    .GetCustomAttribute<AssemblyCompanyAttribute>();
var name = compAttr != null ? compAttr.Company : null;

需要using System.Refelection;。 (在旧版本(.NET 4 和更早版本)中,反射的语法有点复杂。)

如果制作“用户定义”代码,您可以申请:

[assembly: MadeByMe]

到您的每个项目(需要编写public class MadeByMeAttribute : Attribute)。然后搜索该属性,因为它肯定不会出现在 BCL 程序集中。

【讨论】:

    【解决方案3】:

    您可以选择检查程序集的公钥令牌以检查它是否与 Microsoft 的匹配:

    试试这个扩展方法:

    public static bool IsMicrosoftAssembly(this Assembly assembly)
    {
        return assembly.GetName().GetPublicKeyToken()
               .SequenceEqual(typeof(int).Assembly.GetName().GetPublicKeyToken());
    }
    

    像这样使用它:

    var n = typeof(YourType).Assembly.IsMicrosoftAssembly();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-29
      • 1970-01-01
      • 2011-11-28
      • 2023-03-17
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多