[英]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 問題”,你問的是如何實現你想象的解決方案,而不是問如何解決你實際面臨的問題。
如果某些私有字段以某種方式設置,為什么類中的每個屬性都應該返回完全不同的值? 這聽起來像是一個很大的關注點分離問題,你要讓你的班級做兩件完全不同的事情。 我強烈建議您找到另一種方法來解決您正在嘗試解決的問題。 例如,當代碼嘗試獲取您的類的實例時,它可以通過檢查classEnabled
和debug.debugEnabled
概念(可能屬於不同的類)的方法,並返回一個實例,其屬性都設置為它們的默認值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.