我有一个解决方案,我可以将对象的所有属性和子属性映射到Dictionary中。 假设我有类似这些对象的东西:
class MyClassA{
string info;
}
class MyClassB{
string info;
}
class MyClassC{
MyClassA a;
MyClassB b;
string something;
}
class MyClassD{
MyClassC c;
}
我创建了一个实用程序来绘制所有的项目,所以我可以得到类似的东西:
MyClassD dObject = Something();
Dictionary<string, PropertyInfo> propertyMap = new Dictionary<string, PropertyInfo>();
propertyMap = buildPropertyMap(dObject );
其中字符串是路径,PropertyInfo是实际属性。此示例中Map上的字符串将如下所示(伪输出):
propertyMap.Keys={
c;
c.a;
c.b;
c.a.info;
c.b.info;
c.something;
}
这是一个很好的方式来说明从excel文件中读取数据时的内容,而不是类似于xml的内容,如下所示:
ExcelTableC:
-----------------------
1|Ainfo|Binfo|Csomething|
-------------------------
2|value|value|valuevalue|
3|value|value|valuevalue|
-----------------------
它的墙很棒。 现在的事情是,这显然都在几个循环和不同的功能(因为Excel阅读过程),我需要以后获得密钥,这就是,让我说我有这个'属性',我想要的路径(不要问为什么):
// this method does not exist (pseudo-code)
PropertyInfo.GetPath; //it would return 'c.b.info' for ex. or 'c.a.info'
所以我想实现一个扩展PropertyInfo的类来添加我的方法。
但做的事情如下:
public class PropertyField : PropertyInfo
{
PropertyField parent;
string path;
// etc...
}
返回错误,因为PropertyInfo是一个抽象类,我需要实现所有固有成员。
我可以像这样在'PropertyField'中添加'abstract':
public abstract class PropertyField : PropertyInfo {}
但是当我尝试像这样投射时:
private void findProperties(Type objType)
{
PropertyInfo[] properties = objType.GetProperties();
for (int i=0; i< properties.Length; i++)
{
//PropertyInfo propertyInfo = properties[i];
PropertyField property = (PropertyField) properties[i];
//do something with it
}
}
将返回以下错误:
System.InvalidCastException: Unable to cast object of type
'System.Reflection.RuntimePropertyInfo' to type 'App.models.PropertyField'.
所以问题是,如何添加这些方法?如果我不能继承我能做什么?
答案 0 :(得分:0)
使用exstension method扩展PropertyInfo
类,而不是隐藏它。
public static class Extensions
{
public static string GetPath(this PropertyInfo pi)
{
// Your implementation to get the path
}
}
答案 1 :(得分:0)
简短的回答是,PropertyDescriptor
比PropertyInfo
更好。虽然后者由运行时环境使用并在RuntimePropertyInfo
对象中实例化,但后者实际上用于满足您的目的,以描述属性。在Windows.Forms中已经使用了很多属性描述符,基本上整个WinForms设计器都是基于它们构建的,它们非常强大。
并且:您可以轻松地继承``PropertyDescriptor and you even do not have to recreate a whole lot of functionality since
PropertyDescriptor`具有允许您传入名称和一组属性的构造函数。
答案 2 :(得分:0)
你应该这样做:
public class PropertyField
{
PropertyField parent;
string path;
PropertyInfo info;
// etc...
}
我认为继承PropertyInfo毫无意义。