Skip to content

Instantly share code, notes, and snippets.

View pietervp's full-sized avatar

Pieter Van Parys pietervp

View GitHub Profile
public class ActivatableEntity : EntityBase
{
public bool IsActive { get; set; }
public void Active()
{
//...
}
public void DeActivate()
[MData("Customer")]
public interface ICustomer
{
int Id { get; set; }
string Name { get; set; }
string Notes { get; set; }
bool IsActive { get; set; }
DateTime CreatedOn { get; set; }
DateTime ModifiedOn { get; set; }
private void MapInterfaceMethods(FieldInfo classToWrapField, TypeBuilderHelper typeBuilder)
{
//loop al interface methods
foreach (var methodInfo in InterfaceToImplement.GetMethods())
{
//define the method in the generated type
var emitter = typeBuilder.DefineMethod(methodInfo)
.Emitter
//this.[fieldName]
.ldarg_0
private void DefineConstructor(FieldInfo classToWrapField, TypeBuilderHelper typeBuilder)
{
typeBuilder
//take an instance of 'ClassToWrap' as constructor parameter
.DefinePublicConstructor(ClassToWrap)
.Emitter
//: base()
.ldarg_0
.call(typeof(object).GetConstructors()[0])
//this.[fieldName] = [constructorParameter]
var typeBuilder = _assemblyBuilder.DefineType(GetGeneratedTypeName(), typeof(object), InterfaceToImplement);
//create private field
var classToWrapField = typeBuilder.DefineField(GetGeneratedToWrapFieldName(), ClassToWrap, FieldAttributes.Private);
//map interface members
MapInterfaceProperties(classToWrapField, typeBuilder);
MapInterfaceEvents(classToWrapField, typeBuilder);
MapInterfaceMethods(classToWrapField, typeBuilder);
static ClassFactory()
{
_assemblyBuilder = new AssemblyBuilderHelper(GetGeneratedAssemblyPath());
}
private static string GetGeneratedAssemblyPath()
{
return @".\Duck.Tape.Generated.dll";
}
class Program
{
static void Main(string[] args)
{
A a = new A();
ITest aAsITest = a.Duck<ITest>();
}
}
public class A
EmitHelper emit = new AssemblyBuilderHelper("HelloWorld.dll")
.DefineType ("Hello", typeof(object), typeof(IHello))
.DefineMethod(typeof(IHello).GetMethod("SayHello"))
.Emitter;
emit
// string.Format("Hello, {0}!", toWhom)
//
.ldstr ("Hello, {0}!")
.ldarg_1
public static string Format(string format, object arg0, object arg1)
{
return Format(null, format, new object[] { arg0, arg1 });
}
@pietervp
pietervp / gist:3017356
Created June 29, 2012 10:59
public static string Format(string format, object arg0, object arg1)
Offset OpCode
0 ldnull
1 ldarg.0
2 ldc.i4.2
3 newarr System.Object
8 stloc.0
9 ldloc.0
10 ldc.i4.0
11 ldarg.1
12 stelem.ref