Приведение к произвольному типу возврата c во время выполнения, C# - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь создать удобную среду отладки, где пользователи могут создавать как можно больше переменных отладки.

Мне нужно привести объект к типу возврата моего свойства / метода (bool, int, что угодно), без , зная, что это за тип возврата.

tldr : Как я могу вернуть не * generic тип c (в этом примере bool) из

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

БЕЗ указания "return (bool)"? Так что-то вроде

return (GenericThingHereThatPassesAsBool)obj;

или

return obj as MyGetSetPropertyReturnType;

----------

Detail:

Я хочу, чтобы пользователи иметь возможность создавать новые свойства в этом классе как можно проще - в основном копирование + вставка всего блока кода ниже, и только замена «SerializeAll» на имя их переменной, а объявление типа «bool» на тип, который они хотят в поле / объявления свойств.

В моем геттере у меня есть пара отдельных проверок, чтобы увидеть, включена ли вся система отладки. Если нет, он возвращает значение по умолчанию для данной переменной.

[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", где Значение "default" для этого bool на самом деле равно "true", по крайней мере, что касается моей системы отладки. Метод «GetDefaultValue» подходит для этого и возвращает объект , который может быть строкой, int, bool, чем угодно.

Я уже делаю причудливые вещи для отражения, чтобы получить доступ к MethodInfo , PropertyInfo, et c геттера и свойство SerializeAll. Я просто не могу понять, как , а не должны также указывать (bool) приведение к возврату. Опять же, целью является как можно меньшее редактирование человеком.

Спасибо!

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Вы должны быть в состоянии сделать это с приведением к dynamic.

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

Имейте в виду, что компилятор фактически не превращает это в приведение к bool. Скорее, это заставляет компилятор игнорировать безопасность типов во время компиляции, и вместо этого программа будет использовать отражение во время выполнения, чтобы выяснить лучший способ взять значение, возвращаемое из GetDefaultValue, и превратить его в необходимое значение.

Я хочу, чтобы пользователи могли создавать новые свойства в этом классе как можно проще ...

Это хороший принцип.

. .. в основном копирование + вставка всего блока кода ниже, и только замена «SerializeAll» на имя их переменной, а объявление типа «bool» на тип, который они хотят в объявлениях поля / свойства.

Это полностью нарушает принцип, который вы только что упомянули, и приводит к куче шаблонного кода и других запахов кода.

Теоретически, вы, вероятно, могли бы создать Fody Weaver или что-то еще, чтобы добавить этот стандартный код при компиляции. Но это, вероятно, больше работы, чем стоит.

Я бы рискнул предположить, что это «проблема XY», когда вы спрашиваете, как достичь решения, которое вы себе представляли, а не спрашивать, как это сделать. решить проблему, с которой вы на самом деле сталкиваетесь.

Почему каждое свойство в вашем классе должно возвращать совершенно другое значение, если определенные частные поля установлены определенным образом? Это звучит как большая проблема с разделением интересов, когда вы поручаете своему классу выполнить две совершенно разные вещи. Я настоятельно рекомендую вам найти другой способ решения проблемы, которую вы пытаетесь решить. Например, когда код пытается получить экземпляр вашего класса, он может go с помощью метода, который проверяет понятия classEnabled и debug.debugEnabled (которые, вероятно, принадлежат другому классу), и возвращает экземпляр со свойствами все настроены по умолчанию.

0 голосов
/ 13 февраля 2020
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...