C# возврат (динамический c или анонимный?) Объект с возвращаемыми значениями из других методов в качестве свойств - PullRequest
0 голосов
/ 24 марта 2020

Вот вопрос для новичка C#, пожалуйста, ответьте на вопрос, парни и девушки.

Я хотел бы вернуть объект, который хранит возвращаемые значения из других методов класса в качестве свойств возвращаемого объекта. Проблема в том, что я не знаю, какой лучший способ сделать это в C#. В настоящее время я использую своего рода JavaScript -i sh подход. Поскольку я не знаю тип возвращаемого значения, я использую ключевое слово Dynami c.

class Test {

    public static dynamic MyExportingMethod() {
        return new {
            myString = MyStringMethod(),
            myInt = MyIntMethod()
        };
    }

    public static string MyStringMethod() {
        return "Hello";
    }

    public static int MyIntMethod() {
        return 55;
    }

   }

И затем могу получить к ним доступ следующим образом:

var myReturnObjWithProps = Test.MyExportingMethod();
myReturnObjWithProps.myString; // should be "Hello"

Так что мои вопросы я должен использовать возвращаемый тип Dynami c? Разве я не просто возвращаю анонимный объект?

Заранее спасибо за ваши ответы!

Ответы [ 3 ]

2 голосов
/ 24 марта 2020

я должен использовать тип возврата Dynami c?

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

Разве я не просто возвращаю анонимный объект?

Да, но объявленный тип метода фактически object, поэтому на его свойства нельзя ссылаться во время компиляции.

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

2 голосов
/ 24 марта 2020

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

class Foo
{
    string MyString { get; set}
    int MyInt { get; set}
}

class Test 
{

    public static Foo MyExportingMethod() 
    {
        return new Foo
        {
            MyString = MyStringMethod(),
            MyInt = MyIntMethod()
        };
    }

    public static string MyStringMethod() 
    {
        return "Hello";
    }

    public static int MyIntMethod() 
    {
        return 55;
    }
}

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

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

Альтернативой созданию нового класса просто для возврата метода будет ValueTuple:

public static (string myString, int myInt) MyExportingMethod()
{
    return (MyStringMethod(), MyIntMethod());
}

var (myString, myInt) = Test.MyExportingMethod();
myString; // == "Hello"
...