14

我需要使用实现以下接口的 Reflection.Emit 生成一个类。

public interface IObject
{
    T Get<T>(string propertyName); 
}

有没有人有一个例子说明我如何将以下内容作为一个简单的测试用例发出?

class GeneratedObject : IObject
{
    public T Get<T>(string propertyName)
    {
        // this is the simplest possible implementation
        return default(T);
    }
}
4

5 回答 5

8

如果您使用的是 Reflection.Emit,那么您真的应该为Reflector获取一份Reflection.Emit 语言插件的副本。虽然不完美,但它应该让你至少 95% 的方式来处理任何给定的发出代码。

于 2009-10-30T18:25:01.377 回答
4

我手边没有编译器,但是这样的东西应该可以工作:

var aName = new AssemblyName("temp");
var appDomain = Threading.Thread.GetDomain();
var aBuilder = appDomain.DefineDynamicAssembly(aName, AssemblyBuilderAccess.Run);
var mBuilder = aBuilder.DefineDynamicModule(aName.Name);
var tBuilder = mBuilder.DefineType("GeneratedObject", TypeAttributes.Public | TypeAttributes.Class);
tBuilder.AddInterfaceImplementation(typeof(IObject));
var methBuilder = tBuilder.DefineMethod("Get", MethodAttributes.Public | MethodAttributes.Final | MethodAttributes.Virtual);
var typeParam = mb.DefineGenericParameters(new string[] { "T" })[0];
methBuilder.SetParameters(new Type[] { typeof(string) });
methBuilder.SetReturnType(typeParam);
var ilg = methBuilder.GetILGenerator();
let lBuilder = ilg.DeclareLocal(typeParam);
ilg.Emit(OpCodes.Ldloca_S, (byte)0);
ilg.Emit(OpCodes.Initobj, typeParam);
ilg.Emit(OpCodes.Ldloc_0);
ilg.Emit(OpCodes.Ret);
var generatedType = tBuilder.CreateType();
于 2009-11-30T20:57:02.047 回答
0

我相信AutoMapper和/或LinFu会为您做到这一点。你绝对可以使用 AutoMapper 创建一个接口的实例,我已经做到了。

于 2009-11-19T16:56:56.383 回答
0

您忘记 BOX 退货:

internal delegate object FastConstructorHandler(object[] paramters);

    private static FastConstructorHandler CreateDelegate(Type Tipo)
    {
        DynamicMethod dynamicMethod = new DynamicMethod(string.Empty,
            typeof(object), new Type[] { typeof(object[]) }, Tipo.Module, false);

        ILGenerator ilg = dynamicMethod.GetILGenerator();

        ilg.DeclareLocal(Tipo);
        ilg.Emit(OpCodes.Ldloca_S, (byte)0);
        ilg.Emit(OpCodes.Initobj, Tipo);
        ilg.Emit(OpCodes.Ldloc_0);
        ilg.Emit(OpCodes.Box, Tipo);
        ilg.Emit(OpCodes.Ret);

        return (FastConstructorHandler)dynamicMethod.CreateDelegate(typeof(FastConstructorHandler));
    }
于 2010-06-25T19:55:09.937 回答
0

看来,您希望通过对象的名称快速访问对象的属性,而无需在运行时进行反射。使用Yappi及其 Property<> 类,您可以实现给定的接口,如下所示:

class GeneratedObject : IObject
{
    public string Value { get { return "Test"; } }

    public T Get<T>(string propertyName)
    {
        return Property<GeneratedObject>.Get<T>(this,propertyName);
    }
}

然后像这样使用它:

IObject obj = new GeneratedObject();
var value = obj.Get<String>("Value"); //value contains "Test"

你还需要 IObject 和动态类型构造吗?

于 2011-07-31T18:44:41.897 回答