Могу ли я получить значение параметра по умолчанию в методе? - PullRequest
3 голосов
/ 05 марта 2020

Пример:

public static double ComputeFoo(double nom, double den, double epsilon = 2.2e-16)
{
    double den1 = den == 0.0 ? epsilon : den;
    // den1 can still be zero if epsilon is zero
    // is there any way to retrieve 2.2e-16 here and assign it to den1?
    return nom/den1;
}

Есть ли способ получить значение 2.2e-16 и использовать его в методе?

PS: я понимаю, что для этого конкретного примера я могу просто позвонить ComputeFoo(nom, den1).

Ответы [ 5 ]

1 голос
/ 05 марта 2020

Вот другой подход, который я упомянул выше в своем комментарии, используя Reflection; generi c подхода.

public static T GetDefaultOptionalParamValue<T, TClass>(string methodName, string paramName)
{
   if (typeof(TClass).GetMethod(methodName)?.GetParameters().Where(p => p.Attributes.HasFlag(ParameterAttributes.Optional) && 
       p.Attributes.HasFlag(ParameterAttributes.HasDefault) && p.Name == paramName)?.FirstOrDefault()?.DefaultValue is T myValue)
   {
      return myValue;
   }
      else { return default; }
}

Вы можете назвать это так:

 var t = GetDefaultOptionalParamValue<double, ClassName>("ComputeFoo", "epsilon");

t значение 2.2E-16

1 голос
/ 05 марта 2020

Вы можете установить постоянное значение где-нибудь в своем классе и передать его в качестве значения по умолчанию методу. Оказавшись там, вы можете проверить, отличается ли переданное значение от константы или наоборот:

static void Main(string[] args)
{
     Test(0);
}

const int constantValue = 15;

static int Test(int testValue = constantValue)
{
    Console.WriteLine(testValue);
    Console.WriteLine(constantValue);

    return constantValue;
}

Примечание: constantValue должно быть константой для успешного построения.

0 голосов
/ 05 марта 2020

Используйте отражение в System.Diagnostics, чтобы получить доступ к параметрам. Это получит значение по умолчанию третьего параметра включающей функции:

var x = new StackFrame(0).GetMethod().GetParameters()[2].DefaultValue;
0 голосов
/ 05 марта 2020

Невозможно получить значение по умолчанию только из метода. Это может помочь вам сделать значение по умолчанию константой в вашем классе. Например:

private const double epsilonDefault = 2.2e-16;

public static double ComputeFoo(double nom, double den, double epsilon = epsilonDefault)
{
    double den1 = den == 0.0 ? epsilon : den;
    if (den1 == 0) den1 = epsilonDefault;
    return nom / den1;
}

Таким образом, ваше значение по умолчанию объявляется вне метода и доступно, когда вам это нужно.

РЕДАКТИРОВАТЬ: Чтобы завершить, с помощью отражения можно сделать это, но это кажется слишком много для этого вопроса. Базовый c пример того, как сделать это с помощью отражения:

public static void Execute(int number = 10)
{
    Console.WriteLine(number);
    var defaultValue = typeof(Program)
            .GetMethod("Execute")
            .GetParameters()[0]
            .DefaultValue;
    Console.WriteLine(defaultValue); // 10
}
0 голосов
/ 05 марта 2020

НЕТ, ты не можешь. Единственное значение по умолчанию, которое может быть установлено, является нулем

public static double ComputeFoo(double nom, double den, double ?epsilon )
{
    if (epsilon == null)
        epsilon = 2.2e-16

    double den1 = den == 0.0 ? epsilon : den;
    // den1 can still be zero if epsilon is zero
    // is there any way to retrieve 2.2e-16 here and assign it to den1?
    return nom/den1;
}
...