从方法返回的访问C#匿名类型对象

时间:2014-07-31 21:09:02

标签: c# c#-4.0 anonymous-types

有人编写了一个返回对象类型的方法。

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的代码。我尝试过,但它对对象类型不起作用。有什么想法吗?

2 个答案:

答案 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));