C#中使用反射获取结构体实例

原文:C#中使用反射获取结构体实例

一般用反射获取类对象的实例比较简单,只要类有一个无参构造函数没有显示声明带参的构造函数即可使用如下代码

static void Main(string[] args)
{
    Type type = typeof(MyObject);
    object obj = type.GetConstructor(Type.EmptyTypes).Invoke(null);
    Console.WriteLine(obj);
}

class MyObject
{

}

之前我一直没有发现原来结构是不可以这样实例化的

换种方式,似乎结构体使用反射无法得到其构造函数ConstructorInfo对象

类中有一个隐式的构造函数,而结构没有构造函数

我甚至尝试查找非public构造函数

依然没有

这问题一度困扰我很久....解决的方法并不难,所以也没当回事,但今天有个朋友又问到了这个问题,所以总结一下发出来,给同样遇到这个问题的朋友

其实非常简单,只要这样就可以了

static void Main(string[] args)
{
    Type type = typeof(MyStruct);
    object obj1 = type.Assembly.CreateInstance(type.FullName);
}

struct MyStruct
{

}

这个方法说明

Assembly.CreateInstance

使用区分大小写的搜索,从此程序集中查找指定的类型,然后使用系统激活器创建它的实例。

使用这个方法就不用管class还是struct 都是可以用的,如果是class只要保证有无参构造函数就可以了

这个方法不是什么高深的玩意儿,主要是给同样碰到这个问题的同学说明一下

======================================================

感谢 KarasCanvas同学,原来C#还有Activator这么一个类

Activator.CreateInstance(Type)

这样就可以了

时间: 2024-10-16 08:11:35

C#中使用反射获取结构体实例的相关文章

Linux中的两个经典宏定义:获取结构体成员地址,根据成员地址获得结构体地址;Linux中双向链表的经典实现。

倘若你查看过Linux Kernel的源码,那么你对 offsetof 和 container_of 这两个宏应该不陌生.这两个宏最初是极客写出的,后来在Linux内核中被推广使用. 1. offsetof 1.1 offsetof介绍 定义:offsetof在linux内核的include/linux/stddef.h中定义.#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 说明:获得结构体(TYPE)的变量成员(

C语言中的系统时间结构体类型

在C语言涉及中经常需要定时触发事件,涉及到获取系统时间,其结构体类型有多种.Unix/Linux系统下有以下几种时间结构: 1.time_t 类型:长整型,一般用来表示从1970-01-01 00:00:00时以来的秒数,精确度:秒:由函数time()获取: 该类型定义在头文件 /usr/include/sys/time.h 中: #define _TIME_T       typedef   long   time_t;             #endif 函数定义:time_t   tim

Linux中表示“时间”的结构体和相关函数

转载于:http://blog.chinaunix.net/uid-25909722-id-2827364.html Linux中表示“时间”的结构体和相关函数 2011-09-13 17:01:13 分类: C/C++ 在Linux系统中,表示“时间”概念的结构体有多个,相关的时间处理函数也有很多,给人以很混乱的感觉.导致了当我们真正要使用这些结构体和函数的时候,却不知道到底该用哪个结构体和哪些函数.有必要加以归纳总结一下.通过查看头文件/usr/include/time.h 和 /usr/i

UNITY3D c#脚本中处理类与结构体的区别

1.在C#中结构体类型定义时,成员是不能初始化的,这样就导致了,定义结构体变量时,变量的所有成员都要自己赋值初始化.但对于类,在定义类时,就可以初始化其中的成员变量,所以在定义对象时,对象本身就已经有了初始值,你可以自己在重新给个别变量赋值.(注意在C++中,类的定义中是不能初始化的,初始化要放在构造函数中) 2.结构体变量 和类对象 进行值传递时,结构体变量进行的就是值传递,而类对象进行的是引用传递,或者说传递的是指针,这样在函数中改变参数值,结构体对象的值是不变的,而类对象的值是变化了. 下

Swift面向对象基础(上)——Swift中的类和结构体(下)

学习来自<极客学院> 1 import Foundation 2 3 class User { 4 var name:String 5 var age:Int 6 init(name:String,age:Int){ 7 self.age = age 8 self.name = name 9 } 10 } 11 var u1 = User(name:"何杨",age:23) 12 var u2 = User(name:"何杨",age:23) 13 pr

Swift面向对象基础(上)——Swift中的类和结构体(上)

学习来自<极客学院> 1 import Foundation 2 3 //1.定义类和结构体 4 /* 5 [修饰符]calss 类名{ 6 零到多个构造器 7 零到多个属性 8 零到多个方法 9 零到多个下标 10 } 11 修饰符可以是:private public internal final 12 */ 13 14 /*定义结构体 15 [修饰符]struct 结构体名{ 16 17 } 18 修饰符可以是:private public internal 19 */ 20 21 /*

linux内核中的struct rlimit结构体详解

   在linux内核中,对一个进程获取系统资源的数量进行了限制.那么linux内核是如何实现这种对一个进程的各种资源的限制呢?    linux使用struct rlimit结构体来实现的,rlimit是 resource limit的缩写.    struct rlimit           {               unsigned int rlim_cur;  /* soft limit */               unsigned int rlim_max;  /* ha

C#中的类,结构体课堂笔记

C#中的类 C#是一门面向对象的语言,类是C#中一种复杂的数据类型. c#中定义一个类的基本格式: class 类名 { //类成员定义 } 默认情况下,如果class之前没有显示指定访问修饰符,则类的访问修饰符为internal,表示仅在当前项目内可以访问. 除了internal,C#中的修饰符还有private, protected, public, abstract, sealed等修饰符,以及这几个修饰符的组合. 修饰符 访问权限 无或者internal 只能在同一程序集访问类 publ

获取结构体成员偏移量

具体方法 #define offsetoff(TYPE,MEMBER)  ( (size_t)( &( ( (TYPE*)0 )->MEMBER ) ) ) 实现解析     (TYPE*)0是一个空指针,如果使用空指针访问成员肯定造成段错误,但是前面的"&"这个符号,表示我们仅仅取MEMBER字段的地址,而不是引用该字段内容,因此不会造成段错误.     另外,结构体中的字段在内存中分配的地址是连续的,当我们去访问某个字段时,例如,&( ( (TYPE*