我具有与此功能相似的功能,但是我无法对其进行编辑:
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答案 0 :(得分:2)
您需要在类型上调用方法以将其绑定到通用参数:
typeof(ObservableCollection<>).MakeGenericType(someType);
答案 1 :(得分:1)
您可以使方法通用
internal T DoSomething<T>(ObservableCollection<T> coll)
假设方法将返回集合的一个元素,我将其设为返回类型T
。我还删除了Type type
参数,因为它已被通用类型参数取代。
如果您的类型是在type
中动态指定的,则此方法无效。
请注意,ObservableCollection<T>
实现了非通用接口ICollection
,IList
和IEnumerable
。如果在设计时不知道该类型,则最好的方法是使用其中一种。
internal object DoSomething(Type type, ICollection coll)
如果该方法只需要读取集合,那么一个很好的方法是使用IEnumerable<T>
和T
作为所有元素类型的通用基本类型,假定它不是{{1} }。由于接口被声明为
object
与public interface IEnumerable<out T> : System.Collections.IEnumerable
关键字是协变的。这意味着,您可以提供一个具有out
派生的T'
的集合。
请注意,泛型允许您在设计时创建相同类型的变体,但它们绝不是动态的。由于泛型要点就是要赋予类型安全性,因此在动态方案中使用它们(不是类型安全的),因此在动态方案中它们更是一个负担。