Передать именованный параметр условно - PullRequest
3 голосов
/ 12 июня 2011

У меня есть структура, которая принимает 3 именованных параметра в конструктор ...

public struct MyData
{
    private readonly double _value1;
    private readonly double _value2;
    private readonly double _value3;

    public MyData(
        double value1 = 1.0,
        double value2 = 2.0,
        double value3 = 3.0)
    {
        _value1 = value1;
        _value2 = value2;
        _value3 = value3;
    }
}

Вызов метода, который создает класс, получает три обнуляемых типа double, которые я хочу использовать для создания класса MyData, только если значения типа null ...

public MyData CreateMyData(double? value1, double? value2, double? value3)
{
    MyData myData;
    if (value1.HasValue)
    {
        if (value2.HasValue)
        {
            if (value3.HasValue)
            {
                myData = new MyData(value1, value2, value3); 
            }
            else
            {
                myData = new MyData(value1, value2); 
            }
        }
        else
        {
            if (value3.HasValue)
            {
                myData = new MyData(value1, value3: value3); 
            }
            else
            {
                myData = new MyData(value1); 
            }
        }
    }
    else
    {
        if (value2.HasValue)
        {
            if (value3.HasValue)
            {
                myData = new MyData(value2: value2, value3: value3); 
            }
            else
            {
                myData = new MyData(value2: value2); 
            }
        }
        else
        {
            if (value3.HasValue)
            {
                myData = new MyData(value3: value3); 
            }
            else
            {
                myData = new MyData(); 
            }
        }
    }
    return myData;
}

Есть ли лучший способ написать этот метод без изменения класса MyData? То есть Могу ли я условно передать именованные параметры или передать индикатор для представления значения именованного параметра по умолчанию?

Ответы [ 5 ]

2 голосов
/ 12 июня 2011
public MyData(
    double? value1 = null,
    double? value2 = null,
    double? value3 = null)
{
    _value1 = value1 ?? 1.0;
    _value2 = value2 ?? 2.0;
    _value3 = value3 ?? 3.0;
}

Таким образом, вы можете напрямую пройти null с и не пострадает от комбинаторного взрыва .

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

1 голос
/ 12 июня 2011

отметьте это

   public  MyData CreateMyData(double? value1, double? value2, double? value3)
    {
        var ss= typeof(MyData).GetConstructor(new Type[]{typeof(double),typeof(double),typeof(double)});
        var parametesr = ss.GetParameters();
        return new MyData(value1 ?? Convert.ToDouble(parametesr[0].DefaultValue), value2 ?? Convert.ToDouble(parametesr[1].DefaultValue), value3 ?? Convert.ToDouble(parametesr[2].DefaultValue)); 
    }
0 голосов
/ 15 июня 2011

Вам нужно позднее связывание, чтобы сделать это.Платформа с открытым исходным кодом ImpromptuInterface предоставляет доступ к функциям DLR, необходимым для динамического выбора именованных аргументов .

using ImpromptuInterface;

...

public MyData CreateMyData(double? value1, double? value2, double? value3)
{
    var arg = InvokeArg.Create;
    var argList = new List<Object>();
    if(value1.HasValue)
        argList.Add(arg("value1",value1));
    if(value2.HasValue)
        argList.Add(arg("value2",value2));
    if(value3.HasValue)
        argList.Add(arg("value3",value3));

    return Impromptu.InvokeConstructor(typeof(MyData), argList.ToArray());
}
0 голосов
/ 12 июня 2011
var t = typeof (MyData);
var c = t.GetConstructor(new Type[] { typeof(double), typeof(double), typeof(double)});
var p = c.GetParameters();
return new MyData(value1 ?? p[0].DefaultValue, value2 ?? p[1].DefaultValue, value3 ?? p[2].DefaultValue);
0 голосов
/ 12 июня 2011

Может быть, вы просто хотите:

return new MyData(value1 ?? 1.0, value2 ?? 2.0, value3 ?? 3.0);

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