如何获取Reflection.Emit类型的实例?

问题描述 投票:-1回答:1

所以我有一堂课:

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

c# interface reflection.emit
1个回答
0
投票

[如果您有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;
}
© www.soinside.com 2019 - 2024. All rights reserved.