C# return(动态或匿名?)对象,将来自其他方法的 return 值作为属性

C# return (dynamic or anonymous?) object with return values from other methods as properties

我想要 return 一个对象,它将来自其他 class 方法的 return 值存储为 return 对象的属性。问题是我不知道哪种是在 C# 中执行此操作的最佳方法。目前我正在使用一种 JavaScript-ish 方法。因为不知道return类型,所以用了dynamic关键字

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"

所以我的问题是,我应该使用动态 return 类型吗?我不只是 return 一个匿名对象吗?

为 return 类型创建一个 class。为了性能和清晰度,您需要强类型的东西。

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。这样任何人都可以看到您的方法 returning。如果您 return 是动态的,则调用者无法在不查看您的方法的源代码的情况下知道在动态中寻找什么。这样抽象就消失了,结构良好的编程都是关于抽象的。

should I use the dynamic return type?

是 - returns dynamic 有效 returns 和 object 的方法,因此您必须使用 dynamic 才能访问它的属性没有反射的运行时。

Am I not just returning an anonymous object?

是的,但是方法的声明类型实际上是 object,因此无法在编译时引用其属性。

底线 - 您应该尽可能避免从方法返回匿名类型。使用定义的类型,或者将匿名类型的创建和使用保留在一个方法中,这样您就可以使用 var 让编译器推断类型。

为方法 return 创建一个新的 class 的替代方法是 ValueTuple:

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

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