我有此函数返回一个对象:
private object function1()
{
return new
{
string1 = "a",
string2 = "b"
}
}
我想将'string1'存储到变量中。我将如何实现?这是我尝试过的方法,但不能解决问题:
var a = function1().string1;
答案 0 :(得分:3)
换句话说,除非您真的必须
,否则不要使用其他方法您实际上不应该返回匿名类型,执行此操作的正确方法是创建适当的类,然后返回该类。否则,您必须求助于反射或动态类型,而这种类型只是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
换句话说,请不要这样做
使用上面的代码,您可以使用反射来获取属性并手动调用它,例如:
var result = function1();
var property = result.GetType().GetProperty("string1");
var a = (string)property.GetValue(result);
换句话说,请在上面加糖,请不要这样做!
阻止动态返回,您可以调用任何喜欢的方法/属性,但这不是安全类型,如果调用不存在的方法,则会抛出运行时异常。
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}.");