我有一个从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);
因为paramname只是一个类中成员的字符串表示。
简而言之......
方法1具有参数名称,从方法2中获取列表。从方法2中返回的列表中,找到参数名称并返回相关值。
有没有办法做我想做的事情?
答案 0 :(得分: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));
...
}
答案 1 :(得分:1)
我认为使用表达式树会更方便,因为您正在使用集合。您的方法签名需要包含T
和TResult
类型,因为它使用Select
返回IEnumerable<TResult>
。
public static async Task<IEnumerable<TResult>> SelectData<T, TResult>(
string propertyName
)
{
if(string.IsNullOrWhiteSpace(propertyName))
{
return Enumerable.Empty<TResult>();
}
var dataTask = GetTableData<T>();
var tType = Expression.Parameter(typeof(T), "t");
var property = Expression.Property(tType, propertyName);
var selectExpression =
Expression.Lambda<Func<T, TResult>>(property, tType)
.Compile();
return (await dataTask).Select(selectExpression);
}
答案 2 :(得分:-1)
不可能这样做
var retval = data.Select(t => mn.GetValue(t, null));