簡體   English   中英

在c#中,是否有可能在不知道包含類的情況下從該屬性的實例中獲取附加到該屬性的屬性?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM