Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Reflection.Emit创建实现接口的类_C#_.net_Reflection_Interface_Reflection.emit - Fatal编程技术网

C# 使用Reflection.Emit创建实现接口的类

C# 使用Reflection.Emit创建实现接口的类,c#,.net,reflection,interface,reflection.emit,C#,.net,Reflection,Interface,Reflection.emit,我需要使用Reflection.Emit生成一个实现以下接口的类 public interface IObject { T Get<T>(string propertyName); } 公共接口对象 { T Get(字符串属性名称); } 有人举过一个例子来说明我如何将以下内容作为一个简单的测试用例来发布吗 class GeneratedObject : IObject { public T Get<T>(string propertyName)

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

public interface IObject
{
    T Get<T>(string propertyName); 
}
公共接口对象
{
T Get(字符串属性名称);
}
有人举过一个例子来说明我如何将以下内容作为一个简单的测试用例来发布吗

class GeneratedObject : IObject
{
    public T Get<T>(string propertyName)
    {
        // this is the simplest possible implementation
        return default(T);
    }
}
类生成对象:IOObject
{
公共T获取(字符串属性名称)
{
//这是最简单的实现
返回默认值(T);
}
}

如果您使用的是Reflection.Emit,那么您真的应该获取一份for的副本。虽然不是完美的,但它至少可以让您在任何给定的已发出代码中获得95%的成功。

我相信和/或会为您做到这一点。您完全可以使用AutoMapper创建接口的实例,我已经完成了。

我手头没有编译器,但类似的东西应该可以工作:

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();

您忘了将退货装箱:

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));
    }

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

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"
类生成对象:IOObject
{
公共字符串值{get{return“Test”;}
公共T获取(字符串属性名称)
{
return Property.Get(this,propertyName);
}
}
然后像这样使用它:

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 obj=新生成的对象();
var值=对象获取(“值”)//值包含“Test”

您还需要对象和动态类型构造吗?

AutoMapper太慢了!这是一个相当宽泛的声明,没有背景。ymmv,这取决于您的使用情况。您可以对阵列中的100000项进行简单测试。如果你在没有自动映射的情况下编写,速度会快10倍。对于较小的代码集,我相信这种差异并不重要……但性能瓶颈不仅仅是特定的代码行。IMAIBE,当某些方法非常频繁地执行代码时,我确信你会考虑改变它是如何实现的;你看过我链接的文章了吗?-1虽然外接程序可能(或者可能不是,我不知道也不在乎,我不使用Reflector,它很昂贵)非常有用,但这并不能回答问题。您好,我已经成功地使用了您的示例(轻微的代码编辑)。在创建generatedType之后,我使用Activator.CreateInstance(generatedType)获取对象的控制。我将其转换为接口IOObject,然后调用该方法。事实上,它给了我默认值(T)。我需要的是改变这个实现,而不是给我默认值(T),使用一个通用方法来接收这些参数(或参数列表),并给出一个正确的实现。“你知道怎么做到吗?”黑体-对不起,我不能从你的描述中确切地说出你的意思。最好是提出一个新问题,清楚地列出具体细节。