【问题标题】:Determine what property a collection belongs to确定一个集合属于什么属性
【发布时间】:2021-02-17 19:44:34
【问题描述】:

我创建了一个小测试。我怎样才能找出,也许在 void Add(T t) 内部使用反射,该集合属于什么属性?我想通过 PropertyInfo 以编程方式获取属性名称“MyVotes”。

void Main()
{
    var myClass = new MyClass();
    myClass.MyVotes.Add("Democratic");
    myClass.MyVotes.Add("Republican");
    myClass.MyVotes.Add("Independent");
}

public class MyClass
{
    public MyCollection<string> MyVotes { get; }
    
    public MyClass()
    {
        MyVotes = new MyCollection<string>();
    }
}

public class MyCollection<T> : ObservableCollection<T>
{
    public new void Add(T t)
    {
        base.Add(t);
        
        // how do I find out what property name this collection is within MyClass object?
    }
}

【问题讨论】:

  • 没有。如果你在一个变量上调用它怎么办?调用者不应该关心其参数的值被调用。你为什么想知道?
  • 这看起来有点难看,也是非常糟糕的主意。你想达到什么目的?应该有更合适的解决方案。
  • 我正在尝试简化一个集合处理程序,当一个条目出现时,它会调用 AutoMapper 并将其转储到另一个列表中。我可以通过在类中提供更多编译时类型来解决这个问题,只是认为可能有更简单的方法。
  • 这是一个 ObservableCollection,对吧?所以观察它。如果在将项目添加到集合时需要 MyClass 执行某些操作,只需让它处理集合的 CollectionChanged 事件。集合本身不需要知道它在哪里被使用。

标签: c# observablecollection .net-4.8


【解决方案1】:

看起来您可以完全控制源,所以我建议您通过构造函数参数将您需要的信息传递到集合中。

public class MyClass
{
    public MyCollection<string> MyVotes { get; }
    
    public MyClass()
    {
        MyVotes = new MyCollection<string>(nameof(MyVotes));
    }
}

public class MyCollection<T> : ObservableCollection<T>
{
    private readonly string _propertyName;

    public MyCollection(string propertyName) => _propertyName = propertyName

    public new void Add(T t)
    {
        base.Add(t);
        
        Console.WriteLine($"Using {_propertyName}");
    }
}

我在这里使用了nameof 以使其重构安全。如果您需要传递的不仅仅是属性名称,例如PropertyInfo,你可以这样做。

【讨论】:

    猜你喜欢
    • 2010-10-21
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 2019-09-02
    • 2019-08-02
    相关资源
    最近更新 更多