【问题标题】:Check if a class is public or private检查一个类是公共的还是私有的
【发布时间】:2016-03-27 09:32:56
【问题描述】:

正如标题所说,我如何确定一个特定的类是公共的还是私有的?

我尝试了多种方法,但均未成功,并且在此站点中找不到此问题的任何答案。

using System;

namespace ReflectionPublicClass
{
    public class Program
    {
        private class Jedi
        {
            public int MidiChlorians { get; set; }
        }

        static void Main(string[] args)
        {
            Type type = typeof(Jedi);
            try
            {
                Jedi obi = (Jedi)Activator.CreateInstance(type);
                // If public class do something

                // If private do something else
            }
            catch (Exception)
            {
                throw;
            }
        }
    }
}

【问题讨论】:

  • 你到底尝试了什么?为此使用反射。
  • 如果一个类是私有的,那么它肯定是不可访问的。
  • 如何确定?你在哪里有这个班?你能显示一些代码吗?
  • @CodeCaster 我添加了一些代码
  • System.Type 有一个IsPublic property ...

标签: c# types


【解决方案1】:

既然您已经确定了类型 (typeof(Jedi)),您就快到了。 Type 类有两个属性:IsPublicIsNonPublic。您可以使用它们来确定您的类型的访问模式:

public class Public
{ }
internal class Program
{
    private class Private
    {

    }
    [STAThread]
    private static void Main(string[] args)
    {
        Private pr = new Private();
        Console.WriteLine(pr.GetType().IsPublic); // false
        Public pu = new Public();
        Console.WriteLine(pu.GetType().IsPublic); // true

    }

}

但也有一些陷阱。正如 cmets 中已经提到的,您几乎无法创建 private 类的实例,除非它与尝试确定访问修饰符的方法在同一类中声明。

此外,这些属性 (IsPublic) 决定了对类型的有效访问。因此,如果您在内部类中声明公共类,IsPublic 将再次返回false

internal class Program
{
    public class Public
    { }

    [STAThread]
    private static void Main(string[] args)
    {
        Public pu = new Public();
        Console.WriteLine(pu.GetType().IsPublic); // false, because Program is internal
    }
}

根据您要实现的目标,使用反射可能会有更有趣的解决方案。您可能想再次阅读Type 类上的MSDN articles

更新

TypeInfo class 具有更多属性,例如 IsNestedIsNestedPublicIsNestedPrivate。您可以通过以下方式访问:

TypeInfo info = obi.GetType().GetTypeInfo();

我仍然不确定您为什么要确定这一点,但也许使用这些属性和Type.DeclaringType property 您可以推断出您需要的信息。

【讨论】:

  • 即使是“Program”一个公共类,如果“Jedi”是嵌套的,在我的示例中 IsPublic() 将始终返回 false。所以还是没办法弄明白...
  • 我看到但没有 GetTypeInfo()。示例:类型 type = obi.GetType(); if (type.IsNestedPublic)
猜你喜欢
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-07
  • 1970-01-01
  • 2019-08-04
相关资源
最近更新 更多