使用方法参数作为对象的引用

时间:2016-09-12 12:55:01

标签: c# asp.net asp.net-mvc-4

我从SQL数据库返回一个名为AllCodes的代码列表。基本架构如:

id | countrycode | refprint | refscan | reffax 
1 . US . 123 . 234 . 345

我有一个方法,需要根据匹配的国家代码和该结果需要的任何列返回一个值。

这是方法(不工作)但不确定如何用c#

实现这种方式
  private string GetServiceCode(string cc, string name)
    {
        var code = AllCodes.Where(x => x.CountryCode == cc).FirstOrDefault();
        if (code != null)
        {
            // I want to return whatever {name} is, not code.name
            // so if name = "refprint" I want to return code.refprint
            return code.{name};
        }
    }

  // Example:
  GetServiceCode("US","refprint"); // Would return 123

2 个答案:

答案 0 :(得分:2)

你可以通过反思实现这一点:

if (code != null)
{
    PropertyInfo pi = code.GetType().GetProperty(name);
    if (pi == null) return string.Empty;
    object v = pi.GetValue(code);
    if (v == null) return string.Emtpy;
    return v.ToString();
}

使用GetProperty(),您可以获得名为PropertyInfo的媒体资源name。然后,您可以使用GetValue()获取特定实例的属性值(在您的情况下为code)。

在C#6中,您可以将代码缩短为

return code.GetType().GetProperty(name)?.GetValue(code)?.ToString() ?? string.Empty;

答案 1 :(得分:0)

如何使用lambda:

private string GetServiceCode<T>(string cc, Action<T> action)
{
    var code = AllCodes.Where(x => x.CountryCode == cc).FirstOrDefault();
    if (code != null)
    {
        return action(code);
    }
}

// Example:
GetServiceCode("US",(code)=> Console.WriteLine(code.refprint) );