c# - 使用反射从列表中检索值

标签 c# linq generics azure

我有一个简单的方法,可以从 azure 移动服务检索表。

public static async List<T>GetDataFromListTable<T>()
{
    var data = await MobileService.GetTable<T>().ToListAsync();
    return data.Count != 0 ? data : null;
}

这很好用。

我想做的是使用另一种方法,该方法采用从服务返回的参数名称并返回该参数的值。到目前为止我有这个

public static async Task<T> GetDataFromTable<T>(string paramName)
    {
        var k = Activator.CreateInstance(typeof(T));
        var members = typeof(T).GetProperties().Select(t=>t.Name).ToList();
        if (!members.Contains(paramName))
            return (T)k;
        var mn = typeof(T).GetProperties()[members.IndexOf(paramName)];
        var data = GetDataFromListTable<T>();
        var retval = data.Select(t => t.mn);
    }

问题显然是我无法执行 Linq 查询,因为 T 不包含 mn。我也用不了

var retval = data.Select(t=>t.paramName);

as paramname 只是类中成员的字符串表示形式。

简而言之...

方法1有参数名称,从方法2中获取一个列表。从方法2返回的列表中,找到参数名称并返回关联的值。

有办法做我想做的事吗?

最佳答案

你可以这样做:

var retval = data.Select(t => mn.GetGetMethod().Invoke(t, null));

var retval = data.Select(t => mn.GetValue(t, null));

您还可以使用这样的东西简化您的代码(未经测试,抱歉):

public static async Task<T> GetDataFromTable<T>(string paramName)
{
    var k = Activator.CreateInstance(typeof(T));
    var mn = typeof(T).GetProperty(paramName);

    if (mn == null)
        return (T)k;

    var data = GetDataFromListTable<T>();
    var retval = data.Select(t => mn.GetGetMethod().Invoke(t, null));

    ...
}

关于c# - 使用反射从列表中检索值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22863508/

相关文章:

c# - 从 List 中取出一组 5 个字符串

.net - 如何使用连接 PLINQ 现有的 LINQ 查询?

c# - 如果 XSD 未指定 maxOccurs,则 XML 文档中的最大元素数是多少?

c# - 在这种情况下更正 SQL 语法

c# - Ninject:激活字符串时出错

c# - 类对泛型类型参数所做的事情的术语

ios - Swift:使用协议(protocol)扩展专门化方法实现

c# - C# 桌面应用程序中的 session 变量?

C# Linq Lambda Left Join Where Right is Null

java - 使用泛型而不是可克隆的原型(prototype)模式