C#:如何扩展PropertyInfo?

时间:2015-04-27 09:10:21

标签: c# inheritance reflection

我有一个解决方案,我可以将对象的所有属性和子属性映射到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'.

所以问题是,如何添加这些方法?如果我不能继承我能做什么?

3 个答案:

答案 0 :(得分:0)

使用exstension method扩展PropertyInfo类,而不是隐藏它。

public static class Extensions
{
    public static string GetPath(this PropertyInfo pi)
    {
        // Your implementation to get the path
    }
}

答案 1 :(得分:0)

简短的回答是,PropertyDescriptorPropertyInfo更好。虽然后者由运行时环境使用并在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毫无意义。