簡體   English   中英

在運行時轉換為任意非泛型返回類型,C#

[英]Casting to arbitrary non-generic return type at runtime, C#

我正在嘗試制作一個用戶友好的調試框架,用戶可以在其中盡可能輕松地創建更多調試變量。

我需要將一個對象轉換為我的屬性/方法的返回類型(bool、int 等),而不知道該返回類型是什么。

tldr:如何從

public bool MyGetSetProperty {
    get {
        object obj = new object();
        return (bool)obj;
    }
}

沒有指定“返回(布爾)”? 所以像

return (GenericThingHereThatPassesAsBool)obj;

或者

return obj as MyGetSetPropertyReturnType;

----------

細節:

我希望用戶能夠盡可能輕松地在這個類中創建新屬性 - 基本上是復制+粘貼下面的整個代碼塊,只用他們的變量名替換“SerializeAll”,用他們的類型替換類型聲明“bool”想要在字段/屬性聲明上。

在我的 getter 中,我有幾個單獨的檢查來查看是否啟用了整個調試系統。 如果不是,則返回給定變量的默認值。

[Tooltip ("Serialize ALL XML output fields?"), SerializeField]
private bool debugSerializeAll = false;

/// <summary>
/// Serialize ALL XML output fields?
/// </summary>
[DebugValue, DebugDefault (true)]
public bool SerializeAll {

    get {
        if (!classEnabled || !debug.debugEnabled)
            return (bool)GetDefaultValue (MethodBase.GetCurrentMethod ());
        return debugSerializeAll;
    }

    set { debugSerializeAll = value; }

}

問題是,我無法返回“default”,因為可以覆蓋默認值 - 請參閱“DebugDefault”屬性,其中此 bool 的“default”值實際上是“true”,至少就我的調試系統而言擔心的。 方法“GetDefaultValue”適應這種情況,它返回一個對象,可以是字符串、整數、布爾值等。

我已經在做一些時髦的反射來訪問 getter 和屬性 SerializeAll 的 MethodInfo、PropertyInfo 等。 我只是不知道如何不必在返回時也指定 (bool) 類型轉換。 同樣,目標是盡可能少地進行人工編輯。

謝謝!

您應該能夠通過強制轉換為dynamic來做到這一點。

        return (dynamic)GetDefaultValue (MethodBase.GetCurrentMethod ());

請記住,編譯器實際上並沒有將其轉換為bool 相反,這會使編譯器忽略編譯時類型安全,而是程序將在運行時使用反射來找出獲取從 GetDefaultValue 返回的值並將其轉換為所需值的最佳方法。

我希望用戶能夠盡可能輕松地在此類中創建新屬性...

這是一個很好的原則。

...基本上是復制+粘貼下面的整個代碼塊,只用他們的變量名替換“SerializeAll”,用他們想要的字段/屬性聲明的類型替換類型聲明“bool”。

這完全打破了你剛才提到的原則,並導致一堆樣板代碼和其他代碼異味。

從理論上講,您可能可以創建一個 Fody Weaver 或其他東西來在編譯時添加此樣板代碼。 但這可能比它的價值更多。

我冒昧地猜測這是一個“XY 問題”,你問的是如何實現你想象的解決方案,而不是問如何解決你實際面臨的問題。

如果某些私有字段以某種方式設置,為什么類中的每個屬性都應該返回完全不同的值? 這聽起來像是一個很大的關注點分離問題,你要讓你的班級做兩件完全不同的事情。 我強烈建議您找到另一種方法來解決您正在嘗試解決的問題。 例如,當代碼嘗試獲取您的類的實例時,它可以通過檢查classEnableddebug.debugEnabled概念(可能屬於不同的類)的方法,並返回一個實例,其屬性都設置為它們的默認值。

請點擊此處鏈接 -> 如何將對象轉換為布爾值?

或者

我認為你需要學習通用課程

檢查類是否派生自泛型類

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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