使用接口方法获取属性名称列表

本文关键字:列表 属性 获取 接口 方法 | 更新日期: 2023-09-27 18:30:38

我有两种自定义类型CustomerEmployee来实现接口ITablefy。 此接口只有一个方法,GetPropertyList该方法返回实现它的对象的属性名称的字符串列表。 我有一个网络服务,看起来像:

public string ReturnPropertyNames(ITablefy i)
{
    List<string> propList = new List<string>();
    TableFactory factory = new TableFactory();
    ITablefy table = factory.CreateTable(i);
    propList = table.GetPropertyList(table);
    return propList[1];
}

因此,在此示例中,工厂创建了一个实现ITablefy的具体类型

当我的两个类CustomerEmployee完全相同的实现他们的 GetPropertyList 方法时,我意识到当我遇到问题时:

//property list is a private member variable in each class
    public List<string> GetPropertyList(ITablefy i)
    {
        TableFactory factory = new TableFactory();
        ITablefy table = factory.CreateTable(i);
        foreach (var propInfo in table.GetType().GetProperties())
        {
            propertyList.Add(propInfo.Name);
        }
        return propertyList;
    }

与其复制和粘贴该代码,我正在寻找当前更好的解决方案。 如果我只希望某些类型使用 GetPropertyList 方法,如何在不必复制和粘贴相同的代码的情况下对其进行控制? 对要在每个类中创建的类型进行哈希编码对我来说似乎不是一个好的解决方案。 从逻辑上讲,员工和客户使用继承也没有意义。 对于这样的事情,什么是正确的解决方案?

厂:

public class TableFactory
{
    public ITablefy CreateTable(ITablefy i)
    {
        if (i is Employee)
        {
            return new Employee();
        }
        else if (i is Customer)
        {
            return new Customer();
        }
        else
        {
            return null;
        }
    }
}

使用接口方法获取属性名称列表

public static List<string> GetPropertyNames(this Object o)
{
    List<string> names = new List<string>
    foreach (PropertyInfo prop in o.GetType().GetProperties())
        names.Add(prop.Name);
    return names;
}

现在,您可以使用上面的扩展方法在任何object.GetPropertyNames()方面实现ITablefy。

我想到了几个问题:

  1. 如果一般来说很容易做到,你为什么还要使用界面?
  2. 您不应该检查公共访问者的属性吗?
  3. 您的接口不应该返回更通用的类型,如 IEnumerable<string>ICollection<string>
  4. 界面不是更好地设计以过滤掉您不想要的属性名称吗? 这样,您可以假定所有公共属性都是集合的一部分,但那些不是的公共属性除外。

你使界面是这样的:

public interface IPropertyInfoFilterProvider {
    public Func<PropertyInfo, bool> PropertyInfoSkipFilter { get; set; }
}

public interface IPropertyNameFilterProvider {
    public Func<string, bool> PropertyNameSkipFilter { get; set; }
}

然后您可以将默认值初始化为 (prop) => false .

因此,现在您可以在一个位置自动收集属性名称,并让实现确定哪些内容被获取,哪些不被获取,并且您的收集代码可以在 LINQ Where 子句中使用该筛选器。

您可以将其作为ITablefy上的扩展方法。或 ITablefy 上的静态方法