1

実行時に ac# クラスを動的に作成しようとしています。

using System;

class Hist
{
  private int? _min;
  private  int? _max;

  public int? min
  {
      get{return _min;}
      set {_min = value;}
  }

  public int? max
  {
      get{return _max;}
      set {_max = value;}
  }
}

public class ProcessData
{
  private string _id;
  private string _source;
  private int? _currentValue;
  private Hist _hist;

  public Hist hist
  {
      get { return _hist; }
      set{ _hist = value; }
  }

  public string id 
  {
      get {return _id;}
      set { _id = value; }
  }

  public string source 
  {
      get {return _source;}
      set { _source = value; }
  }

  public int? currentValue 
  {
       get {return _currentValue;}
       set { _currentValue = value; }
  }

  public int? min
  {
      get { return (hist != null) ? hist.min : null; }        
  }
  public int? max
  {
      get { return (hist != null) ? hist.max : null; }        
  }
}

しかし、私はこれを具体的に行うことができません。

return (hist != null) ? hist.max : null;

クラスのプロパティminまたはmaxプロパティのgetメソッドが必要です。ProcessData

上記のタスクの私のコード:

var method = parentType.GetMethod("get_" + propertyName);
getPropMthdBldr = tb.DefineMethod("get_" + propertyName, 
      MethodAttributes.Public | 
      MethodAttributes.SpecialName | 
      MethodAttributes.HideBySig, 
    propertyType, Type.EmptyTypes);
getIl = getPropMthdBldr.GetILGenerator();
var moveTo = getIl.DefineLabel();
getIl.Emit(OpCodes.Ldarg_0);
getIl.EmitCall(OpCodes.Call, parentGetMethod, Type.EmptyTypes);
getIl.Emit(OpCodes.Brtrue_S, moveTo);
getIl.Emit(OpCodes.Ldloca_S, 0);
getIl.Emit(OpCodes.Initobj, typeof(int?));
getIl.Emit(OpCodes.Ldloc_0);
getIl.Emit(OpCodes.Ret);
getIl.MarkLabel(moveTo);
getIl.Emit(OpCodes.Ldarg_0);
getIl.EmitCall(OpCodes.Call, parentGetMethod,Type.EmptyTypes);
getIl.EmitCall(OpCodes.Callvirt, method,Type.EmptyTypes);
getIl.Emit(OpCodes.Ret); 
4

1 に答える 1