c# – 在泛型中返回一个新实例而不是null实例
发布时间:2020-12-15 19:50:18 所属栏目:百科 来源:网络整理
导读:我有一个从隔离存储中提取对象的类.如果它找不到有问题的对象,则返回默认值(T),该值为null,因为它们是引用类型.如果返回的值为null,我会进行简单检查并在调用者中分配一个新实例,但我更愿意在存储逻辑中执行此操作. 所以我的问题是,有没有办法返回一个新的T,
我有一个从隔离存储中提取对象的类.如果它找不到有问题的对象,则返回默认值(T),该值为null,因为它们是引用类型.如果返回的值为null,我会进行简单检查并在调用者中分配一个新实例,但我更愿意在存储逻辑中执行此操作.
所以我的问题是,有没有办法返回一个新的T,其中对象有一个默认的空白构造函数? 解决方法
一个选项是使用约束“新”:
http://msdn.microsoft.com/en-us/library/sd2w2ew5(v=vs.80).aspx 像这样: public T GetNewItem() where T: new() { return new T(); } 但是具有此约束意味着您不能使用没有默认构造函数的类型.因此,您可以考虑使用System.Activator.CreateInstance,但请记住它可能会抛出异常: T createInstance<T>() { try { return System.Activator.CreateInstance<T>(); } catch (MissingMethodException exc) { return default(T); } } 因此,在初始化的早期知道给定类型是否支持这一点可能是一个好主意,这样做的方法如下: T createInstance<T>() { System.Reflection.ConstructorInfo constructor = (typeof(T)).GetConstructor(System.Type.EmptyTypes); if (ReferenceEquals(constructor,null)) { //there is no default constructor return default(T); } else { //there is a default constructor //you can invoke it like so: return (T)constructor.Invoke(new object[0]); //return constructor.Invoke(new object[0]) as T; //If T is class } } 当你在这里时,为什么不让一个创建实例的委托? Func<T> getConstructor<T>() { System.Reflection.ConstructorInfo constructor = (typeof(T)).GetConstructor(System.Type.EmptyTypes); if (ReferenceEquals(constructor,null)) { return () => { return default(T); }; } else { return () => { return (T)constructor.Invoke(new object[0]); }; } } 如何使用它的示例(使用LinqPad编译): void Main() { Console.WriteLine(getConstructor<object>()()); Console.WriteLine(getConstructor<int>()()); Console.WriteLine(getConstructor<string>()()); Console.WriteLine(getConstructor<decimal>()()); Console.WriteLine(getConstructor<DateTime>()()); Console.WriteLine(getConstructor<int?>()()); } 输出是: System.Object 0 null 0 01/01/0001 12:00:00 a.m. null string的情况是一种特殊情况,它是一个引用类型,它可以为null,并且没有公共默认构造函数,而不是String.Empty.可空类型也给出null. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- java – 用于读/写pbxproj/xcodeproj文件的库?
- ruby – 如何从Sinatra进行Github风格的Markdown渲染?
- Google Chrome 未响应。是否立即重新启动?---解决方法(秒速
- Oracle删除当前用户的所有对象(表、视图、触发器、存储过程
- u-boot-2014.10移植第15天----nor flash操作
- 提升SQLite数据插入效率低、速度慢的方法
- Ajax+FormData+javascript实现无刷新表单信息提交
- c# – 在64位下执行缓慢.可能的RyuJIT错误?
- Oracle快速替换UNDO表空间方法
- react-native创建android原生模块