尝试使用反射来查找类的第一个 Int32 属性

发布于 2024-09-25 04:46:19 字数 348 浏览 3 评论 0原文

我正在尝试找到类的第一个属性,它是一个Integer ..并获取它的值。

所以我有以下代码..它总是返回 false:

foreach(var property in type.GetProperties(BindingFlags.Public |
    BindingFlags.Instance))
{
    var someType = property.PropertyType is int; // Always false.
}

为什么这是/我做错了什么。这应该很简单:(

/我今天过得很糟糕......

I'm trying to find the first property of a class that is an Integer .. and get it's value.

So i've got the following code .. which always returns false:

foreach(var property in type.GetProperties(BindingFlags.Public |
    BindingFlags.Instance))
{
    var someType = property.PropertyType is int; // Always false.
}

Why is this / what did I do wrong. This should be really simple :(

/me is having a bad day ...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

羞稚 2024-10-02 04:46:19

将测试更改为:

var firstInt32Property = property.PropertyType == typeof(int);

这是必要的,因为属性的属性类型本身不是整数:它是一个(松散地)表示属性类型的System.Type对象-getter 返回/ property-setter 接受。另一方面,在包含类型的实例上调用属性 getter 将产生一个实际的整数。

下面是使用 LINQ 代替 foreach 循环的方法:(

var firstInt32Property = type.GetProperties(BindingFlags.Public | BindingFlags.Instance)
                             .First(p => p.PropertyType == typeof(int)); 

如果不存在这样的属性,这将引发异常。)


从包含类型的实例中检索属性的值:

int value = (int)firstInt32Property.GetValue(myObj, null);

这将如果“第一个”Int32 属性恰好是一个索引器,或者实际上它根本没有 getter,那么当然会失败。如果可能出现这种情况,您可以在原始查询中过滤掉此类属性。


另请注意,此代码的用途有限,因为“类的第一个属性是整数”的想法有点可疑。来自Type.GetProperties

GetProperties方法不
返回特定的属性
顺序,例如按字母顺序或
申报单。你的代码一定不能
取决于其中的顺序
返回属性,因为
顺序各不相同。

Change the test to:

var firstInt32Property = property.PropertyType == typeof(int);

This is necessary because the property's property-type is itself not an integer: it is aSystem.Typeobject that (loosely) represents what type the property-getter returns / property-setter accepts. On the other hand, invoking the property getter on an instance of the containing-type will produce an actual integer.

Here's a way to use LINQ instead of the foreach loop:

var firstInt32Property = type.GetProperties(BindingFlags.Public | BindingFlags.Instance)
                             .First(p => p.PropertyType == typeof(int)); 

(This will throw an exception if no such property exists.)


To retrieve the value of the property from an instance of the containing type:

int value = (int)firstInt32Property.GetValue(myObj, null);

This will of course fail if the 'first' Int32 property happens to be an indexer or indeed if it simply doesn't have a getter. You could filter such properties out on the original query if such scenarios are likely.


Also note that this code is of limited use because the idea of 'the first property of a class that is an integer' is a little bit suspect. FromType.GetProperties:

The GetPropertiesmethod does not
return properties in a particular
order, such as alphabetical or
declaration order. Your code must not
depend on the order in which
properties are returned, because that
order varies.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文