【问题标题】:how to check whether a variable is a class or not in c#如何在c#中检查变量是否为类
【发布时间】:2019-07-24 06:23:47
【问题描述】:

我有一个将object 作为参数的函数

例如:

public static void doSomthingWithObject(object obj)
{
 (.....)
}

我想检查我得到的对象是一个类还是一个简单的变量(例如,如果它需要一个构造函数来创建),如果是这样,我想得到那个object的所有属性,所以代码将看起来像这样:

public static void doSomthingWithObject(object obj)
{
 if(objectIsClass())
  {
    object[] arr = obj.getAllPropeties
 (.....)
  }
  else
  {
 (.....)
  }
}

这可能吗?

编辑: 人们发现我对类变量和简单变量的定义令人困惑。为了清楚起见,“简单变量”是一个只能保存一个值的变量,要访问这个值,您需要简单地写“= var”,而“类变量”可以保存多个值(除非它有 1-0 个属性),并且可以使用get 访问其每个值,例如:= obj.prop(除非没有get)这种类型的变量中的每个值都由一个属性保存,并且要定义一个新的类属性必须使用new 关键字

【问题讨论】:

  • struct 呢?
  • @Johnny 所以它返回true 如果它是int, string, etc...?
  • (e.g if it requires a constructor to create) 每种类型都需要一个构造函数来创建。 string 和其他一些类型(int 等)看起来 不像,但它们仍然是在幕后构造的。您感兴趣的具体类型是什么,为什么?
  • 想象一下任何具有implicit operator 的类。你不需要写SomeClass instance = new SomeClass();,你可以写SomeClass instance = otherThing;。在你的“需要一个构造函数”的想法中,这将如何影响?

标签: c# variables types new-operator


【解决方案1】:

在 C# 中,你看到的一切要么是类,要么是结构体(例如 Int 是结构体)。

所以问题归结为两件事,

  1. 你想知道所有没有无参数构造函数的类型吗(比如 int 没有) 为此,

    bool ObjectIsClass(object o)
    {
       return  o.GetType().GetConstructor(new Type[0])!=null;
    }
    
  2. 你想寻找原始类型

    bool IsPrimitive(object o)
    {
       return o.GetType().IsPrimitive;
    }
    

【讨论】:

    【解决方案2】:

    我认为应该这样做:

        public static void DoSomthingWithObject(Object obj)
        {
            if (!obj.GetType().IsPrimitive)
            {
                Console.WriteLine("This is a class.");
                var properties = obj.GetType().GetProperties();
                foreach (var p in properties) {
                    Console.WriteLine(p);
                }
            }
            else
            {
                Console.WriteLine("This is NOT a class.");
            }
        }
    

    不确定您所说的“获取所有属性”是什么意思。但是此代码将检查 indata 是否是非原始类的实例,并为您提供所有属性的名称。也许这是一个开始。

    【讨论】:

    • “所以它返回 true 如果它的 int、string 等......” - 所以当你认为它“应该这样做”时它实际上没有。
    • 也许我误解了他的问题。但对我来说,正如他所说,这会从类的实例中整理出“简单变量”。
    • 请特别注意string 是不是原始的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    相关资源
    最近更新 更多