这是我的第一篇文章,尽管我在某种程度上搜索了与我的问题相关的主题,但我在查找正确答案方面遇到了很多问题。即时创建新的PropertyInfo对象
我的问题可能很简单,但我知道答案可能不那么容易给。如果有的话。
有了这样说,这是我的情况:作为一个例子,我有的PropertyInfo对象,我使用摆脱类的属性的数组,像这样:
public PropertyInfo[] GetProperties (object o)
{
PropertyInfo[] properties = o.GetType().GetProperties();
return properties;
}
看起来简单, 对?现在我的问题是这样的:如何创建一个新的PropertyInfo对象并将其添加到数组?
我已经看到其他帖子,用户想要设置一个PropertyInfo的值,但这不是我所需要的。我需要的是即时创建一个新的PropertyInfo对象,其中唯一可用的数据是名称和类型。
我之前发布的测试案例仅仅是我试图实现的一个小例子。 我真正和最终目标是什么,其实是为了能够根据这个类来创建一个新的PropertyInfo:
public class DynamicClass
{
public Type ObjectType { get; set; }
public List<string> PropertyNameList { get; set; }
public List<Type> PropertyTypeList { get; set; }
}
我希望有人能帮助我实现这一目标。提前谢谢了!
编辑:我忘了在GetProperties()方法之前添加o.GetType()。谢谢Ilya Ivanov!
我打电话的方法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表。但是在我的情况,我将有两种类型的列:每一个数据库表类(又名基本列),然后附加列,我在动态适应我已经供应的提供者。
例如:如果数据库表类:
public class Table1
{
public int Field1;
public string Field2;
public string Field3;
}
然后我提供所谓“动作”类型的字符串的一个额外的列,然后在DataTableParser类,在_properties attribure应该是以下信息:
_properties[0] should be int32 Field1
_properties[1] should be String Field2
_properties[2] should be String Field3
_properties[3] should be String Action
,老实说这是ALL我所需要的!没有更多,没有什么!剩下的我已经解析了!最后,因为与传递给DataTableParser类的对象有不同数量的列(提供),所以在对数据表进行排序和过滤期间,它总是给出错误。
请帮忙吗?我真的需要它!再次感谢。
最好的问候,
路易斯
通常你会浏览'aType.GetProperties'。 – 2013-03-26 15:46:51
'typeof(o)'这不会编译。可能你的意思是'o.GetType()。GetProperties()' – 2013-03-26 15:48:53
你打算如何使用这个试图创建的对象? – Andrei 2013-03-26 15:50:39