在运行时强制转换为任意非泛型返回类型,C#



我正在尝试制作一个用户友好的调试框架,用户可以在其中尽可能轻松地创建更多调试变量。

我需要将一个对象强制转换为我的属性/方法的返回类型(布尔值、整数等(,而不知道该返回类型是什么。

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; }
}

问题是,我不能返回"默认值",因为默认值可以被覆盖 - 请参阅"DebugDefault"属性,其中此布尔值的"默认"值实际上是"true",至少就我的调试系统而言。方法"GetDefaultValue"可以容纳它,它返回一个对象,该对象可以是字符串,整数,布尔值,任何内容。

我已经在做时髦的反射来访问getter和属性SerializeAll的方法信息,属性信息等。我只是不知道如何不必在返回时指定(布尔(投射。同样,目标是尽可能少地进行人工编辑。

谢谢!

您应该能够使用dynamic的演员表来执行此操作。

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

请记住,编译器实际上并没有将其转换为bool的强制转换。相反,这会使编译器忽略编译时类型安全,相反,程序将在运行时使用反射来找出获取从 GetDefaultValue 返回的值并将其转换为所需值的最佳方法。

我希望用户能够尽可能轻松地在此类中创建新属性......

这是一个很好的原则。

。基本上复制+粘贴下面的整个代码块,并且只将"SerializeAll"替换为它们的变量名,并将类型声明"bool"替换为他们在字段/属性声明上想要的类型。

这完全打破了你刚才提到的原则,并导致一堆样板代码和其他代码异味。

从理论上讲,您可能会创建一个 Fody Weaver 或其他东西来在编译时添加此样板代码。但这可能比它的价值更多的工作。

我冒昧地猜测这是一个"XY问题",你问如何实现你想象的解决方案,而不是问如何解决你实际面临的问题。

如果以某种方式设置某些私有字段,为什么类中的每个属性都应返回完全不同的值?这听起来像是一个很大的关注点分离问题,你让你的班级做两件完全不同的事情。我强烈建议你找到另一种方法来解决你试图解决的问题。例如,当代码尝试获取类的实例时,它可以通过一个方法检查classEnableddebug.debugEnabled概念(可能属于不同的类(,并返回一个实例,其属性全部设置为默认值。

请链接点击这里 -> 如何将对象转换为布尔值?

我认为你需要学习通用课程

检查类是否派生自泛型类

最新更新