所以我有一堂课:
public class MyClass : IMyClass
{
public string foo {get;}
public string bar {get;}
}
和一个接口:
public interface IMyClass
{
string foo {get;}
}
以及创建发射类型的系统:
(编辑了MakeDynamicType的代码,因为否则堆栈溢出会抱怨我的问题主要是代码)
所以现在如何从IMyClass类型引用到MyClass对象创建反射类型的实例?
public static IEnumerable<T> ToInterfacedObjects<T>(this IEnumerable<T> data) where T : class
{
var myType = MakeDynamicType<T>();
var list = new List<T>();
foreach (var datum in data)
{
list.Add((T)myType.GetValue(datum));//What do I write for GetValue??
}
return list;
}
我的目标是从IMyClass
开始,其具有MyClass
的基础类型,同时具有foo和bar,并以IMyClass
结束,其具有所发出的类型的基础类型,其具有foo
],但没有bar
。
[如果您有MakeDynamicType<T>
的实现,并且假设您的接口仅具有简单的{get; set;}
属性,那么会不会这么简单:
public static IList<T> ToInterfacedObjects<T>(this IEnumerable<T> data) where T : class
{
var myType = MakeDynamicType<T>();
var list = new List<T>();
foreach (var datum in data)
{
var obj = (T)Activator.CreateInstance(myType);
foreach (var pi in typeof(T).GetProperties())
{
var val = pi.GetValue(datum);
pi.SetValue(obj, val);
list.Add(obj);
}
}
return list;
}