访问从方法返回的c#匿名类型对象
本文关键字:类型 对象 方法 返回 访问 | 更新日期: 2023-09-27 18:15:49
有人写了一个返回对象类型的方法。
public object GetProvider(double personId)
{
// Some other code here
return new {
FirstName = Convert.ToString(reader["FirstName"]),
LastName = Convert.ToString(reader["LastName"])
};
}
在代码的不同部分,我们使用了这个库方法。var d = GetProvider(123);
string fName = d.GetType().GetProperty("FirstName").GetValue(d, null).ToString();
我如何改进或简化这段代码?我猜他们应该创建一个类并返回它的对象而不是对象类型。此外,我在c# 4中看到过使用dynamic
的代码。我试过了,但它对对象类型不起作用。任何想法吗?
像这样实现动态:
dynamic d = GetProvider(123);
string fName = d.FirstName;
似乎这部分实际上与原始帖子无关,因为OP无法控制方法的返回类型。我把它留在这里,因为它仍然是最佳实践,在大多数情况下都应该遵循,在理想的世界里,原始方法的作者会读到这篇文章并改变他或她的方法。
但是一般来说,我更倾向于仅仅创建一个类型。这并不是说要花那么多的精力来启动一个类来做你想做的事情。
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
那么你可以让所有东西都是强类型的,你不需要使用dynamic
。我认为我还没有找到dynamic
真正合适的用途。它很好,因为它快速且易于编写,但在99%的实际使用中,从长远来看,它往往会导致问题。我并不是说应该废除它,因为这1%是有用的(我在这里考虑的是动态数据的序列化,但即使在那里,我通常也只是使用字符串索引器属性),但一般来说,在使用它之前要三思其行,并确保没有更好的解决方案。匿名类型在LINQ查询中很有用,因为它都是在作用域内编译的,但我不会使用它们来改变作用域,除非你绝对必须这样做,而且你很可能永远不会这样做。
如果是我,我可能会将GetProvider的结果包装在强类型类中。下面的类接受GetProvider的响应作为其构造函数的参数。
public class Provider
{
public Provider(object provider)
{
dynamic dynamicProvider = provider;
this.FirstName = dynamicProvider.FirstName;
this.LastName = dynamicProvider.LastName;
}
public string FirstName { get; set; }
public string LastName { get; set; }
}
然后替换
var d = GetProvider(123);
var d = new Provider(GetProvider(123));