如何从返回对象的函数中获取属性的值?

时间:2018-06-28 09:37:11

标签: c# function oop object

我有此函数返回一个对象:

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

我想将'string1'存储到变量中。我将如何实现?这是我尝试过的方法,但不能解决问题:

var a = function1().string1;

4 个答案:

答案 0 :(得分:3)

选项1-正确执行

换句话说,除非您真的必须

,否则不要使用其他方法

您实际上不应该返回匿名类型,执行此操作的正确方法是创建适当的类,然后返回该类。否则,您必须求助于反射或动态类型,而这种类型只是hacky:

班级:

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;

答案 1 :(得分:2)

我强烈建议使用正确的类定义,而不是返回匿名类型

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);
    }   

}

答案 2 :(得分:1)

您可以创建一个新类来代替返回新对象:

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;

答案 3 :(得分:0)

正如其他人所说, proper 的实现方式是创建一个返回结果的类。

但是,从C#7开始,还有一个名为 tuple deconstruction 的选项(注意:您至少需要一个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}.");