设置属性 Nullable<>通过反思
我尝试设置一个 Nullable<>动态属性。
我获取我的属性 ex:
PropertyInfo property = class.GetProperty("PropertyName"); // My property is Nullable<> at this time So the type could be a string or int
我想通过反射设置我的属性,就像
property.SetValue(class,"1256",null);
当我的属性为 Nullable<> 时它不起作用通用的。所以我试图找到一种方法来设置我的属性。
要知道我的 nullable<> 的类型我执行的财产
Nullable.GetUnderlyingType(property.PropertyType)
有什么想法吗?
-
我尝试创建 Nullable<> 的实例属性与
var nullVar = Activator.CreateInstance(typeof(Nullable<>).MakeGenericType(new Type[] { Nullable.GetUnderlyingType(property.PropertyType) }));
但 nullVar 始终为 Null
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
如果要将任意字符串转换为 Nullable 的基础类型,可以使用 Convert 类:
如果目标类型是 int、short、long(或无符号变体,因为输入字符串表示非负数)、双精度、浮点数或小数。警告:这不是快速代码。
If you want to convert an arbitrary string to the underlying type of the Nullable, you can use the Convert class:
This example will work if the target type is int, short, long (or unsigned variants, since the input string represents a non-negative number), double, float, or decimal. Caveat: this is not fast code.
如果它是可为 null 的 int,则需要使用 int 参数,而不是字符串。
请注意对 klass 的更改,而不是 class,因为 class 是保留关键字。如果绝对必要的话,您也可以使用@class(引用它)。
如果您的属性是通用的,那么我认为您可能需要使用 Convert 将您拥有的任何内容转换为您需要的任何内容。
If it's a nullable int, you'll need to use an int parameter, not a string.
Note the change to klass, instead of class, as class is a reserved keyword. You could also use @class if absolutely necessary (quoting it).
If your property is a generic, then I think you'll probably need to use Convert to convert whatever you have to whatever you need.
这是一个完整的示例,展示了如何做到这一点:
正如其他人提到的,您需要将正确的类型传递给 SetValue 函数,但您的其他反射代码也不太正确。您需要先获取相关类的类型,然后才能查询其成员。
编辑:如果我理解正确的话,您正在尝试通过反射将字符串值设置为任何属性。为此,您需要进行一些类型检查和类型转换。
下面是我的意思的一个示例:
无论该属性是否为 Nullable,都可以安全地使用此方法。
Here is a complete example showing how to do it:
As others have mentioned you need to pass the right type to the
SetValue
function but your other reflection code is not quite right either. You need to get the type of the class in question before you can query for its members.Edit: If I understand correctly you are trying to set a string value to any property via reflection. In order to do this you will need to do some type inspection and type conversion.
Here is an example of what I mean:
This approach can be safely used regardless of whether or not the property is
Nullable<>
.我遇到了同样的问题,以及 Convert.ChangeType 不处理 Nullables 上的 DateTimes 的问题,因此我将几个 stackoverflow 解决方案与一些 .NET 4 动态魔法结合起来,得到了一些我认为很不错的东西。如果你看一下代码,我们会在运行时使用动态将对象类型设置为 Nullable,然后运行时会以不同的方式对待它,并允许将基类型分配给可为 null 的对象。
I hit this same problem as well as an issue with Convert.ChangeType not handling DateTimes on Nullables so I combined a couple of stackoverflow solutions with some .NET 4 dynamic magic to get something I think is kind of sweet. If you look at the code, we use dynamic to type the object to Nullable at run time, then the run time treats it differently and allows assignments of the base type to the nullable object.
"1256"
是一个字符串,而不是一个整数。"1256"
is a string, not an int.