【发布时间】:2016-05-17 05:16:30
【问题描述】:
标题有点拗口,但在代码中更容易看到:
public struct MyStruct {
public bool HasAttribute(Attribute attribute) {
//is there any way to know?
return ??????;
}
}
public class MyClass {
[SomeAttribute]
MyStruct child;
public MyClass() {}
}
我已经知道如何通过获取每个属性的属性信息然后调用GetCustomAttributes 来查找MyClass.child 上的属性,但这仅在我知道结构实例对应于MyClass.child 时才有效。我想在这里做的是弄清楚结构的特定实例是否具有附加到它的属性,而不知道哪个类包含特定实例。
如果您不能对引用类型执行此操作对我来说是有意义的,因为实例可以从多个位置引用,但属性集不应该始终为值类型定义良好吗?
我的用例是创建一个库,通过附加自定义属性可以稍微修改某些对象的行为。如果有更惯用的方法来解决这个问题,那么我愿意接受建议。如果允许解决方案,我也愿意进入不安全的环境。
【问题讨论】:
-
在谈论值类型与引用类型时,我试图在我的问题中解决这个问题。我的理解是,结构的特定实例只能从一个地方引用,因为它是一种值类型。我同意这对课程没有意义。
-
我认为这是不可能的,因为自定义属性旨在扩展内置属性,例如
public、private、static。自定义属性的行为类似于这些内置属性,就像我们无法知道实例是声明为公共还是私有一样。 -
谢谢,这说明了问题。你认为有可能找到一个对象的范围吗?对于结构中的代码来确定它是 MyClass 的属性?也许有反射?
-
为什么需要实例方法HasAttribute来获取非实例相关信息?我的意思是,你不能把实现改成这样吗? HasAttribute
(()=>yourObj.MyStructProp)?通过这种方式,您可以操纵表达式以了解道具是否附加了属性 -
如果我理解正确的话,这需要知道包含结构的对象。上下文是供其他人使用的库,因此不可能拥有此信息。
标签: c# reflection attributes