использование неназначенной переменной 'format', "attr1", "attr2", "attr3" - PullRequest
0 голосов
/ 03 августа 2020

Как мы можем передать значения из возврата другого метода? Я хотел получить значения format, attr1, attr2, attr3 из метода GetFormat(). Но почему-то не могу этого понять. Что мне не хватает? Однако я их инициализировал, но это не сработало.

public static bool GetFormat()
{
    string format, attr1, attr2, attr3 = string.Empty;
    try
    {
        string globalFormat = GetGlobalConfigStringValue(GLOBAL_CONFIG_ADVANCED_FULL_NAME);

        XmlDocument doc = new XmlDocument();
        doc.LoadXml(globalFormat.ToString());
        XmlElement root = doc.DocumentElement;
        XmlNodeList nodes = root.SelectNodes("//DisplayName");
        format = nodes[0].SelectSingleNode("Format").InnerText.ToString();
        attr1 = nodes[0].SelectSingleNode("Atrribute1").InnerText.ToString();
        attr2 = nodes[0].SelectSingleNode("Atrribute2").InnerText.ToString();
        attr3 = nodes[0].SelectSingleNode("Atrribute3").InnerText.ToString();
        if (string.IsNullOrWhiteSpace(globalFormat) || string.IsNullOrWhiteSpace(attr1) || string.IsNullOrWhiteSpace(attr2))
        {
            return false;
        }
    }
    catch (Exception)
    {
        return false;
    }

    return true;
}
 
public static string GetProfileDisplayName(string profileUID)
{
    string format, attr1, attr2, attr3 = string.Empty;
    if (GetFormat())
    {
        using (var context = GetAccessEntitiesContext())
        {
            var user = context.vw_Profile.Where(x => x.ProfileUID.Equals(profileUID)).FirstOrDefault();

            return string.Format(format, user.GetType().GetProperty(attr1).GetValue(user), user.GetType().GetProperty(attr2).GetValue(user), user.GetType().GetProperty(attr3).GetValue(user));
        }
    }
    else
    {
        format = "{0} {1}";
        attr1 = "FirstName";
        attr2 = "LastName";
        using (var context = GetAccessEntitiesContext())
        {
            var user = context.vw_Profile.Where(x => x.ProfileUID.Equals(profileUID)).FirstOrDefault();

            return string.Format(format, user.GetType().GetProperty(attr1).GetValue(user), user.GetType().GetProperty(attr2).GetValue(user));
        }
    }
}

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Есть несколько способов добиться этого, вам нужно реорганизовать свой метод GetFormat.

Способ 1) Сделайте DTO и верните этот DTO из вашего метода -

public static GetFormatModel GetFormat()
{
    GetFormatModel model = new GetFormatModel();
    try
    {
        string globalFormat = GetGlobalConfigStringValue(GLOBAL_CONFIG_ADVANCED_FULL_NAME);

        XmlDocument doc = new XmlDocument();
        doc.LoadXml(globalFormat.ToString());
        XmlElement root = doc.DocumentElement;
        XmlNodeList nodes = root.SelectNodes("//DisplayName");
        model.format = nodes[0].SelectSingleNode("Format").InnerText.ToString();
        model.attr1 = nodes[0].SelectSingleNode("Atrribute1").InnerText.ToString();
        model.attr2 = nodes[0].SelectSingleNode("Atrribute2").InnerText.ToString();
        model.attr3 = nodes[0].SelectSingleNode("Atrribute3").InnerText.ToString();
        
        if (string.IsNullOrWhiteSpace(globalFormat)
        || string.IsNullOrWhiteSpace(model.attr1) 
        || string.IsNullOrWhiteSpace(model.attr2))
        {
            model.isSuccess = false;
            return model;
        }
    }
    catch (Exception)
    {
        model.isSuccess = false;
        return model;
    }

    model.isSuccess = true;
    return model;
}

// DTO
public class GetFormatModel
{
    public bool isSuccess { get; set; }
    public string format { get; set; } = string.Empty;
    public string attr1 { get; set; } = string.Empty;
    public string attr2 { get; set; } = string.Empty;
    public string attr3 { get; set; } = string.Empty;
}

Способ 2) Возврат generic Tuple

public static Tuple<bool, string, string, string, string> GetFormat()
{
    Tuple<bool, string, string, string, string> tplGetFormat = default(Tuple<bool, string, string, string, string>);
    try
    {
        string globalFormat = GetGlobalConfigStringValue(GLOBAL_CONFIG_ADVANCED_FULL_NAME);

        XmlDocument doc = new XmlDocument();
        doc.LoadXml(globalFormat.ToString());
        XmlElement root = doc.DocumentElement;
        XmlNodeList nodes = root.SelectNodes("//DisplayName");
        tplGetFormat.Item2 = nodes[0].SelectSingleNode("Format").InnerText.ToString();
        tplGetFormat.Item3 = nodes[0].SelectSingleNode("Atrribute1").InnerText.ToString();
        tplGetFormat.Item4 = nodes[0].SelectSingleNode("Atrribute2").InnerText.ToString();
        tplGetFormat.Item5 = nodes[0].SelectSingleNode("Atrribute3").InnerText.ToString();
        
        if (string.IsNullOrWhiteSpace(globalFormat)
        || string.IsNullOrWhiteSpace(tplGetFormat.Item3) 
        || string.IsNullOrWhiteSpace(tplGetFormat.Item4))
        {
            tplGetFormat.Item1 = false;
            return tplGetFormat;
        }
    }
    catch (Exception)
    {
        tplGetFormat.Item1 = false;
        return tplGetFormat;
    }

    tplGetFormat.Item1 = true;
    return tplGetFormat;
}

Способ 3) Возврат out параметры -

public static bool GetFormat(
out string format, 
out string attr1, 
out string attr2, 
out string attr3
)
{
    format = attr1 = attr2 = attr3 = string.Empty;
    try
    {
        string globalFormat = GetGlobalConfigStringValue(GLOBAL_CONFIG_ADVANCED_FULL_NAME);

        XmlDocument doc = new XmlDocument();
        doc.LoadXml(globalFormat.ToString());
        XmlElement root = doc.DocumentElement;
        XmlNodeList nodes = root.SelectNodes("//DisplayName");
        format = nodes[0].SelectSingleNode("Format").InnerText.ToString();
        attr1 = nodes[0].SelectSingleNode("Atrribute1").InnerText.ToString();
        attr2 = nodes[0].SelectSingleNode("Atrribute2").InnerText.ToString();
        attr3 = nodes[0].SelectSingleNode("Atrribute3").InnerText.ToString();
        if (string.IsNullOrWhiteSpace(globalFormat) || string.IsNullOrWhiteSpace(attr1) || string.IsNullOrWhiteSpace(attr2))
        {
            return false;
        }
    }
    catch (Exception)
    {
        return false;
    }

    return true;
}

// Usage
string format = attr1 = attr2 = attr3 = string.Empty;
GetFormat(out format, out attr1, out attr2, out attr3);
1 голос
/ 03 августа 2020

Если вы хотите «вернуть» несколько значений из метода в C#, есть несколько способов сделать это. Один из самых простых - использовать несколько параметров out. То есть параметры метода объявляются с ключевым словом out, и вы вызываете метод, передавая параметры извне с тем же ключевым словом. Затем внутри метода, когда вы присваиваете ему значение, на это значение можно ссылаться извне.

public static void GetValues(out int a, out int b, out int c)
{
    a = 1;
    b = 2;
    c = 3;
}

Назовите его так:

GetValues(out int valA, out int valB, out int valC);

И напечатайте:

Console.WriteLine("a: {0}", valA);
Console.WriteLine("b: {0}", valB);
Console.WriteLine("c: {0}", valC);

Вывод:

a: 1
b: 2
c: 3

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

public class GetValueClass
{
    public int A { get; set; }
    public int B { get; set; }
    public int C { get; set; }
}

public static GetValueClass GetValues()
{
    var values = new GetValueClass() { A = 11, B = 22, C = 33 };
    return values;
}

Вызов и печать значений:

GetValueClass values = GetValues();
Console.WriteLine("A: {0}", values.A);
Console.WriteLine("B: {0}", values.B);
Console.WriteLine("C: {0}", values.C);

Вывод:

A: 11
B: 22
C: 33

ПРИМЕЧАНИЕ

В этой строке кода:

string format, attr1, attr2, attr3 = string.Empty;

Я думаю, что вы ожидаете, что он будет назначать string.Empty всем 4 string переменным. Но в отличие от некоторых других языков программирования C# не делает этого; он присваивает только string.Empty attr3, а остальные будут null.

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