这是我的第一篇文章,虽然我在某种程度上搜索了与我的问题相关的主题,但我很难找到正确的答案。
我的问题可能很简单,但我知道答案可能并不那么容易给出。如果有的话。
话虽如此,这就是我的情况:例如,我有一个 PropertyInfo 对象数组,我用它来从类中获取属性,如下所示:
public PropertyInfo[] GetProperties (object o)
{
PropertyInfo[] properties = o.GetType().GetProperties();
return properties;
}
看起来很容易,对吧?现在我的问题是:如何创建一个新的 PropertyInfo 对象并将其添加到数组中?
我看过其他帖子,用户想要设置 PropertyInfo 的值,但这不是我需要的。我需要动态创建一个新的 PropertyInfo 对象,其中我拥有的唯一可用数据是Name和Type。
我之前发布的测试用例只是我想要实现的一个小例子。事实上,我真正的最终目标是能够基于这个类创建一个新的 PropertyInfo:
public class DynamicClass
{
public Type ObjectType { get; set; }
public List<string> PropertyNameList { get; set; }
public List<Type> PropertyTypeList { get; set; }
}
我希望有人可以帮助我实现这一目标。提前谢谢了!
编辑:我忘了在 GetProperties() 方法之前添加 o.GetType() 。谢谢伊利亚伊万诺夫!
我这样调用方法 SelectProperties:
list = _queriable.Select(SelectProperties).ToList();
该方法如下所示:
private Expression<Func<T, List<string>>> SelectProperties
{
get
{
return value => _properties.Select
(
prop => (prop.GetValue(value, new object[0]) ?? string.Empty).ToString()
).ToList();
}
}
此致,
路易斯
更新:
好的,所以我遵循 280Z28 的建议,并在一个新类中继承 PropertyInfo。我做了更多研究,在 MSDN 中发现我需要重写以下方法:GetValue、SetValue、GetAccessors、GetGetMethod、GetSetMethod 和 GetIndexParameters。
但是,当我尝试使用参数调用 base 时,它给了我一个错误提示,我引用了“无法调用抽象成员:'System.Reflection.PropertyInfo.GetAccessesors(bool)'”。如果我尝试在没有任何参数的情况下调用该方法,它不会显示任何错误,但我觉得这是错误的方法。
这是我到目前为止所得到的:
public override MethodInfo[] GetAccessors(bool nonPublic)
{
MethodInfo[] temp = base.GetAccessors(nonPublic);
return temp;
}
更新 2:
好吧,那效果不好。经过几个小时尝试执行 PropertyInfo 或 PropertyDescriptor 的派生类后,我决定不采用这种方法。
相反,我从阅读其他帖子中获得了另一个想法。我真正的问题在于,我通常阅读和用于获取属性的类并不总是相同的。所以我意识到我可能真正需要的只是一种动态创建动态类的方法,然后才能获取属性。
我读到有一种叫做 ExpandoObject 和 ElasticObject 的东西,虽然我还不知道如何将它们应用到我的问题中以便最终得到解决方案。
好的,现在我真正要做的是 -> 我一直在使用以下链接中提到的解决方案:jQuery DataTables Plugin Meets C#。
问题是,这假设每个数据库表都有不同的静态模型/类。但是,在我的情况下,我将有两种类型的列:由每个 DB 表类提供的列(也称为基本列),然后是我在改编中已经动态提供的其他列。
例如:如果这是 DB 表类:
public class Table1
{
public int Field1;
public string Field2;
public string Field3;
}
然后我提供了一个额外的列,名为“Action”,类型为 string,然后在 DataTableParser 类中,在 _properties 属性中应该有以下信息:
_properties[0] should be int32 Field1
_properties[1] should be String Field2
_properties[2] should be String Field3
_properties[3] should be String Action
老实说,这就是我所需要的!不多不少,不多不少!其余的我已经在解析了!
最后,因为我的列数(提供的)与传递给 DataTableParser 类的对象不同,所以在对 DataTable 进行排序和过滤时总是会出错。
请问有什么帮助吗?我真的很需要!再次感谢。
此致,
路易斯