[英]Is it possible in c# to get the attributes attached to a property from within the instance of that property, without knowing the containing class?
标题有点冗长,但是在代码中更容易看到:
public struct MyStruct {
public bool HasAttribute(Attribute attribute) {
//is there any way to know?
return ??????;
}
}
public class MyClass {
[SomeAttribute]
MyStruct child;
public MyClass() {}
}
我已经知道如何通过获取MyClass.child
的每个属性的属性信息,然后调用GetCustomAttributes
来查找MyClass.child
的属性,但这仅在我知道struct实例对应于MyClass.child
情况下才有效。 我在这里想要做的是找出某个结构的特定实例是否具有附加的属性,而又不知道哪个类包含该特定实例。
如果您不能为引用类型执行此操作对我来说很有意义,因为可以从多个地方引用该实例,但是难道不应该为值类型始终定义好属性集吗?
我的用例是创建一个库,其中可以通过附加自定义属性来稍微修改某些对象的行为。 如果有一种更惯用的方式来处理此问题,那么我愿意提出建议。 如果允许解决方案,我也愿意进入一个不安全的环境。
抱歉,那是不可能的。 [SomeAttribute]
附加到MyClass
的字段 ,并且与MyStruct
完全无关。
由于以下几个原因,无法获得结构的容器 :
它可以只是一个局部变量或一个临时变量,这意味着该结构既可以存在于堆栈中,也可以存在于CPU寄存器中。 因此,那里没有包含类。
它可以包含在另一个结构中,该结构也将受到相同的问题。
如果它包含在一个类中,则必须仅使用结构的地址来检索容器类型。 如果可能的话,这将涉及非常讨厌的代码。
试想一下:这样的结构的地址就是其包含类的地址加上偏移量。 您必须以某种方式找到容器的vtable的地址(假设您可以仅从内存地址推断出看起来像vtable的地址)。 这将是完全危险/不安全和不可靠的,因为您必须取消引用未知的地址,所以始终冒着访问冲突的风险。 只是没有办法从中获得可靠的东西。
哦,您还必须这样做,因为GC可能会移动您的容器对象,而不会固定它,因为您首先不知道其地址。
一个更明智的方法是使用CLR调试API,但在这一点上,我假设您只是不想召唤Cthulhu 。
我敢肯定还有很多其他方法可以实现您想要的目标,但是如果没有更多细节,我将无法更加具体。 现在,建议您使用其他参数显式初始化您的结构:
public class MyClass {
MyStruct child = new MyStruct(doThatSpecialThingie: true);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.