如何确定属性/字段是否为参考类型(使用反射)

时间:2015-03-27 13:35:27

标签: c# reflection

我已经查看了this链接。有一个问题,通常有一个不可思议的术语"参考"。首先,我想澄清何时在我看来一个Type是一个引用类型。

这是非引用类型的行为。

        string bla = "abc";
        string blob = bla;
        bla = "cde";
        // bla = "cde" and blob = "abc"

这是引用类型

的行为
        Person jens = new Person("Jens");
        Person frank = jens; // doesn't make any sense i know
        frank.Name = "Frank";
        //jens.Name = "Frank" and frank.Name = "Frank"

正如您所看到的,只有在引用时才传递一个引用(如c中的指针)。您还可以使用参考关键字来实现非参考类型的行为。

我要搜索的是Type类的属性,它指示类型是否为引用类型。

它也应该适用于结构,只适用于您可以存储的所有内容"其中的东西。

根据我上面提供的链接,有多个属性,都略有不同

  • IsClass
  • IsPrimitive
  • IsValueType

我需要使用哪一个? 他们似乎都不符合我的条件。

抱歉我的英语不好:)

2 个答案:

答案 0 :(得分:1)

String是一种特殊的内置类型,如Int32Double,它具有特殊属性,您可以将其表示为C#中的文字值。两者也恰好都是immutable types,我认为这可能与你正在努力解决的问题有些相关。

我的猜测是你对C#中的引用含义做了一些错误的假设。两种语言都使用了referencestruct这两个词,但它们各自的含义却截然不同。

在第二个示例中,frankjens都是对相同实际对象的引用。可以把它们想象成是内存中相同地址的指针 - 因为在那里的某个地方,它们是。

看起来您相信当您将jens分配给frank时,您正在调用复制构造函数。如果jensfrank是C ++中的堆栈变量,那将会发生什么。但C#不是C ++。 C#引用是可重新绑定的。就赋值而言,它就像C ++中的指针,而不是C ++引用。但是与C ++指针不同,你不能做"指针算法"有了它,你不需要取消引用它。

在C#中,如果要复制引用类型的实例,例如String或(显然)Person,则需要明确地执行此操作。

//  Assume Person has a Person(String name) constructor
Person bob = new Person("Bob");

//  This assigns a **reference to bob** to a new reference variable.
//  steve and bob are now referencing the same object. Not what you want.
Person steve = bob;

//  Person should have a copy constructor. If that's done correctly, 
//  this will create a COPY of the object that both steve and bob
//  refer to. 
Person bob2 = new Person(steve);

//  Because we explicitly created a new instance for bob2, this won't
//  affect the other "Bob" instance that bob and steve still refer to.
bob2.Name = "Bob Junior";

A"非参考" C#中的类型称为structDateTime就是一个例子。复制时,C#struct的行为类似于堆栈上的C ++类实例:它是一个隐式副本。

//  DateTime is a struct. It's IsValueType, NOT IsClass. 
//  Different behavior. 
DateTime today = DateTime.Now.Date;

//  This creates a copy, because DateTime is a struct not a class.
DateTime alsoToday = today;

这只是(值得称赞的)对语言的一般好奇心,还是您尝试解决的具体问题?我经常发现,当有人问你为什么要这么做时?"答案使我们比专注于您尝试用来解决问题的特定技术更有帮助。像这样的问题通常暗示OP选择了错误的解决方案。

答案 1 :(得分:0)

IsValueType正是您要找的。

请注意:string实际上是参考类型。