mercredi 12 février 2020

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

I'm trying to make a user-friendly debug framework where users can create more debug variables as easily as possible.

I need to cast an object to the return type of my property/method (bool, int, whatever), without knowing what that return type is.

tldr: How can I return a non-generic type (in this example bool) from

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

WITHOUT specifying "return (bool)"? So something like

return (GenericThingHereThatPassesAsBool)obj;

or

return obj as MyGetSetPropertyReturnType;

----------

Detail:

I want users to be able to create new properties in this class as easily as possible - basically copying+pasting the whole code block below, and only replacing "SerializeAll" with their variable name, and the type declaration "bool" with the type they want on the field/property declarations.

In my getter, I have a couple separate checks to see if the entire debug system is enabled. If not, it returns a default value for the given variable.

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

}

The thing is, I can't return "default" because the default value can be overridden - see the "DebugDefault" attribute where the "default" value for this bool is actually "true", at least as far as my debug system is concerned. The method "GetDefaultValue" accommodates for that, and it returns an object that could be a string, int, bool, anything.

I'm already doing funky reflection stuff to access the MethodInfo, PropertyInfo, etc of the getter and property SerializeAll. I just can't figure out how to not have to also specify the (bool) cast on the return. Again, the goal is as little human editing as possible.

Thank you!





Aucun commentaire:

Enregistrer un commentaire