【问题标题】:Method accepting ObservableCollection<T> as parameter接受 ObservableCollection<T> 作为参数的方法
【发布时间】:2014-03-20 09:25:33
【问题描述】:

我有一些具有不同对象模型的 ObservableCollections,它们都继承自同一个基本模型。例如:

class Food { }
class Pizza : Food { }
class Rice : Food { }
class Spaghetti : Food { }

每个都有一个 ObservableCollection:

ObservableCollection<Pizza> pizzaOC;
ObservableCollection<Rice> riceOC;
ObservableCollection<Spaghetti> spOC;

然后我有一个具有ObservableCollection&lt;Food&gt; 参数的方法,如下所示:

private bool CheckFood(ObservableCollection<Food> foodItems)
{
    // stuff here
}

当我尝试拨打电话时出现问题:

CheckFood(pizzaOC);
CheckFood(riceOC);
//...

有什么方法可以调用单个方法,但传递不同类型的 ObservableCollections?还有,有没有办法在方法中查出,通过了哪个OC类型?

【问题讨论】:

    标签: c# inheritance observablecollection


    【解决方案1】:
    private bool CheckFood<T>(ObservableCollection<T> foodItems) where T: Food
    {
       ...
    }
    

    您可以使用 typeof(T) 之类的方式确定传递给方法的食物类型,但最好将逻辑责任转移到类本身

    【讨论】:

    • 这绝对是最好的方法。如果您需要知道方法内对象的类型,那么最好将此方法设为虚拟并用继承自“FoodViewModel”的类中的特定行为覆盖它您可以通过以下方式检查 Food 对象的类型:typeof (T) 或在集合或其对象之一上使用“is”或“as”运算符。
    • 感谢这个作品,我会尽快接受。第二个问题:是否也可以在方法中找到T的类型?
    【解决方案2】:

    如果您的方法不依赖于显式 ObservableCollection&lt;T&gt; 的参数,您始终可以使用 code to the interface

    public bool CheckFood<TCollection, TItem>(TCollection collection)
        where TCollection : ICollection<TItem>, INotifyCollectionChanged
        where TItem : Food
    {
        // something
    }
    

    这意味着如果您想使用自定义的“可观察集合”,则无需依赖它从 ObservableCollection 继承。

    另外要找出传递给方法的类型,您可以在方法中调用以下内容:

    var type = typeof(TItem);
    

    【讨论】:

      猜你喜欢
      • 2016-01-12
      • 1970-01-01
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-18
      • 1970-01-01
      相关资源
      最近更新 更多