Как получить значение свойства из функции, которая возвращает объект? - PullRequest
0 голосов
/ 28 июня 2018

У меня есть эта функция, которая возвращает объект:

 private object function1()
 {
   return new
   {
     string1 = "a",
     string2 = "b"
   }
 }

Я хочу сохранить 'string1' в переменной. Как я добьюсь этого? Вот что я пробовал, но это не решает проблему:

var a = function1().string1;

Ответы [ 4 ]

0 голосов
/ 28 июня 2018

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

Однако, в C # 7 есть еще одна опция, которая называется деконструкция кортежа (примечание: вам нужен по крайней мере компилятор C # 7, такой как в Visual Studio 2017, чтобы это работало):

private (string, string) Function1()
{
  return ("a", "b");
}

// In your calling method:
(string left, string right) = Function1();
System.Console.WriteLine($"left = {left}, right = {right}.");
0 голосов
/ 28 июня 2018

Вариант 1 - сделать это правильно

Другими словами, не используйте другие методы, если вы действительно не должны

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

Класс:

public class Foo
{
    public string String1 { get; set; }
    public string String1 { get; set; }
}

Метод:

private Foo Function1()
{
    return new Foo
    {
        String1 = "a",
        String2 = "b"
    }
}

Использование:

var a = Function1().String1; // Though it's worth checking for a null return in production code

Вариант 2 - Использовать отражение

Другими словами, не делайте этого

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

var result = function1();

var property = result.GetType().GetProperty("string1");
var a = (string)property.GetValue(result);

Вариант 3 - использование динамического набора

Другими словами, пожалуйста, с сахаром сверху, не делайте этого!

Приведите возврат к динамическому, и вы можете вызвать любой метод / свойство, которое вам нравится, но это не является безопасным для типа и вызовет исключение времени выполнения, если вы вызовете несуществующий метод.

var result = (dynamic)function1();
var a = (string)result.string1;
0 голосов
/ 28 июня 2018

Я бы настоятельно рекомендовал использовать правильное определение класса вместо возврата анонимного типа

class MyClass {
    string string1 {get;set;}
    string string2 {get;set;}
}


private MyClass function1() {
    return new MyClass {
       string1 = "a", string2 = "b"
    };
}


Console.WriteLine(function1().string1);

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

public class Program
{
    public static object f1() {
        return new {string1 = "a", string2 = "b"};
    }

    public static void Main()
    {
        var x = f1();
        var p = x.GetType().GetProperty("string1");
        string s = (string)p.GetValue(x);
        Console.WriteLine(s);
    }   

}
0 голосов
/ 28 июня 2018

Вы можете создать новый класс, чтобы заменить его новым объектом:

public class TestClass
{
public string str1{set;get;}
public string str2{set;get;}
}

Пример:

private TestClass function1()
 {
   return new TestClass()
   {
     str1 = "a",
     str2 = "b"
   }
 }

Использование:

var a = function1().str1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...