0

我有一个类似于这个的功能,我无法编辑它:

internal object DoSomething(Type type, object obj)

我需要将类型作为 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

4

2 回答 2

2

您需要调用该类型的方法以将其绑定到泛型参数:

typeof(ObservableCollection<>).MakeGenericType(someType);
于 2019-11-16T19:37:02.923 回答
1

您可以使该方法通用

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

我创建了返回类型T,假设该方法将返回集合的一个元素。我还删除了Type type参数,因为它被泛型类型参数替换。

如果您的类型是在 中动态给出的type,那么这种方法不起作用。


请注意,它实现ObservableCollection<T>了非泛型接口ICollection和. 如果在设计时不知道该类型,那么您能做的最好的事情就是使用其中之一。IListIEnumerable

internal object DoSomething(Type type, ICollection coll)

如果该方法只需要读取集合,一个好的方法是使用IEnumerable<T>withT作为所有元素类型的通用基类型,假设它不是object. 由于接口被声明为

public interface IEnumerable<out T> : System.Collections.IEnumerable

out关键字,它是协变的。这意味着,您可以提供一个T'来自的集合T


请注意,泛型允许您在设计时创建相同类型的变体,但它们绝不是动态的。由于泛型的重点是提供类型安全,因此在动态场景(不是类型安全的)中使用它们,它们在动态场景中更多的是负担。

于 2019-11-16T19:19:46.960 回答