如何传递ObservableCollection <T>

时间:2019-11-16 19:11:07

标签: c# litedb

我具有与此功能相似的功能,但是我无法对其进行编辑:

internal object DoSomething(Type type, object obj)

我需要将type作为ObservableCollection的类型传递,但是T在设计时是未知的。

这还不够:

Type t = typeof(ObservableCollection<>);

我该如何解决?

编辑

使用LiteDb时,可以将POCO类属性与LiteDb对象进行映射。 默认情况下,ObservableCollection返回一个数组。 我需要通过传递ObservableCollectio来更改此默认行为,并获取BsonDocument

此代码有效:

BsonMapper.Global.RegisterType<ObservableCollection<Phone>>
              (serialize: (ObservableCollection) => OCToDoc(Client.Phones),
              deserialize: (BsonDocument) => new ObservableCollection<Phone>()
              );


    public BsonDocument OCToDoc<T>(ObservableCollection<T> oc)
    {           

        BsonDocument doc = new BsonDocument();
        Type t = typeof(T);
        BsonDocument item = new BsonDocument();
        doc.Add(t.Name, item);

        foreach (PropertyInfo pi in t.GetProperties())
        {
            string key = pi.Name;
            item.Add(key, new BsonValue());
        }

        return doc;
    }

LiteDb.dll中的RegisterType是:

public void RegisterType<T>(Func<T, BsonValue> serialize, Func<BsonValue, T> deserialize);
public void RegisterType(Type type, Func<object, BsonValue> serialize, Func<BsonValue, object> deserialize);

无论哪种ObservableCollection类型,我都需要进行通用映射。 这意味着

ObservableCollection<Phone> 

必须为

ObservableCollection<T> 

其中T在运行时未知。 因此,如何在RegisterType <...>和OCToDoc(...)

中传递ObservableCollection

2 个答案:

答案 0 :(得分:2)

您需要在类型上调用方法以将其绑定到通用参数:

typeof(ObservableCollection<>).MakeGenericType(someType);

答案 1 :(得分:1)

您可以使方法通用

internal T DoSomething<T>(ObservableCollection<T> coll)

假设方法将返回集合的一个元素,我将其设为返回类型T。我还删除了Type type参数,因为它已被通用类型参数取代。

如果您的类型是在type中动态指定的,则此方法无效。


请注意,ObservableCollection<T>实现了非通用接口ICollectionIListIEnumerable。如果在设计时不知道该类型,则最好的方法是使用其中一种。

internal object DoSomething(Type type, ICollection coll)

如果该方法只需要读取集合,那么一个很好的方法是使用IEnumerable<T>T作为所有元素类型的通用基本类型,假定它不是{{1} }。由于接口被声明为

object

public interface IEnumerable<out T> : System.Collections.IEnumerable 关键字是协变的。这意味着,您可以提供一个具有out派生的T'的集合。


请注意,泛型允许您在设计时创建相同类型的变体,但它们绝不是动态的。由于泛型要点就是要赋予类型安全性,因此在动态方案中使用它们(不是类型安全的),因此在动态方案中它们更是一个负担。