[英]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.