有人编写了一个返回对象类型的方法。
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
的代码。我尝试过,但它对对象类型不起作用。有什么想法吗?
答案 0 :(得分:3)
像这样实施动态:
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查询中非常有用,它们都是范围内和编译的,但我不会使用它们来改变范围,除非你绝对必须这样做,而且你很可能永远不会这样做
答案 1 :(得分:1)
如果这是我,我可能会将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));