2016-05-09 4 views
-1

プロパティを持つオブジェクトを持つクラスがあります。これらのオブジェクトにはメソッドがあります。文字列値/変数から、オブジェクトであるこのプロパティを取得してそのメソッドを実行したいと思います。C#プロパティであるオブジェクトを取得し、文字列値からオブジェクト内のメソッドを実行します。

var property = this.GetType().GetProperty("SomePropertyObject"); 
MethodInfo getMethod = property.GetMethod; 
var obj = getMethod.Invoke...... 
var runMethod = obj.GetType().GetMethod("SomeMethod"); 
runMethod.Invoke(obj, new object[] { value1 }); 

問題は、私がプロパティを取得したときに、取得するメソッドと設定するメソッドしかないことです。 getメソッドでオブジェクトを取得できる場合は、オブジェクトメソッドを実行できます。可能であれば教えてください。どうすればいいですか?

ご協力いただき誠にありがとうございます。

編集:

基本的に私は、エンティティフレームワークDbContextクラスに監査を追加したいです。私は小規模のプロジェクトのために単一のテーブル監査を作成しましたが、今はリフレクションを使用してテーブルごとの監査を作成したいと考えています。 AuditIdとAction(更新、追加、ソフト削除など)を持つそれぞれのモデルと同じ監査モデルを作成できます。 ModelとModelAuditの間でプロパティー値を転送するためにリフレクションを使用します。

ModelAuditをそれぞれのDbSetコレクションに追加する現在のswitch文を変更したいと思います。私が正しくあなたの質問を理解していた場合は、次の操作を行うことができ

private void SaveAudit(DbEntityEntry entry) 
    { 
     try 
     { 
      var name = entry.Entity.GetType().Name; 
      var space = entry.Entity.GetType().Namespace; 
      var type = Type.GetType(string.Format("{0}.Audits.{1}Audit", space, name)); 

      object audit = null; 

      if (type != null) 
      { 
       audit = Activator.CreateInstance(type); 

       var props = 
        entry.Entity.GetType() 
         .GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy); 

       audit.GetType().GetProperty("Action").SetValue(audit, entry.State.ToString()); 

       foreach (var prop in props) 
       { 
        if (prop.CanWrite && prop.CanRead) 
         switch (prop.PropertyType.ToString()) 
         { 
          case "System.String": 
          case "System.string": 
          case "System.Int32": 
          case "System.Nullable`1[System.Int32]": 
          case "System.Int64": 
          case "System.bool": 
          case "System.Nullable`1[System.Boolean]": 
          case "System.DateTime": 
          case "System.Nullable`1[System.DateTime]": 
           audit.GetType().GetProperty(prop.Name).SetValue(audit, prop.GetValue(entry.Entity)); 
           break; 
         } 
       } 

       // TODO: Replace with reflection. 
       if (!entry.State.ToString().Equals("Unchanged")) 
       { 
        switch (name) 
        { 
         case "Account": 
          AccountAudits.Add((AccountAudit) audit); 
+0

サンプルオブジェクトを表示できますか? –

+0

あなたが 'this'を使っているとすれば、' this.SomePropertyObject.SomeMethod(value1); 'をなぜ呼び出さないのですか?あなたのコメントがあなたの問題に当てはまらない場合は、より良い例を与える必要があるかもしれません。 – Nkosi

+0

私の編集が私の状況を少し良く説明してくれることを願っています。 – JayKayOf4

答えて

0

public static object RunMethod(object o, string propertyName, string methodName, object[] methodArguments = null) 
{ 
    var properyInfo = o.GetType().GetProperty(propertyName, BindingFlags.Public | BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.Static) 

    if (properyInfo == null) 
     //No such property, bail out appropiately 

    var invokeTarget = properyInfo.GetValue(o); 

    if (invokeTarget == null) 
     //Property returned null, bail out appropiately 

    var argumentTypes = methodArguments == null ? Enumerable.Empty<Type>() : methodArguments.Select(a => a.GetType()); 
    var methodInfo = invokeTarget.GetType().GetMethod(methodName, argumentTypes.ToArray()); 

    if (methodInfo == null) 
     //No such method, bail out appropiately 

    return methodInfo.Invoke(invokeTarget, methodArguments); 
} 
+0

丁寧な回答ですが、オブジェクトは、クラスがインスタンス化されるときにプロパティとしてインスタンス化されます。 – JayKayOf4

+0

@ JayKayOf4私はあなたに従うことはありません。私はプロパティを介してインスタンスを取得しています。たぶん 'o'を使ってあなたを混乱させているかもしれません、あなたの例に基づいた' this'です。 – InBetween

+0

最初の投稿を編集しました。私のシナリオについて説明してくれることを願っています。 – JayKayOf4

0

これは、リフレクションで行われ、の形で何かを行うことができます。

Type type = Assembly.GetType(some_type); 
MethodInfo method = type.GetMethod(name_of_method); 
ParameterInfo[] parameters = method?.GetParameters(); 
object instance = Activator.CreateInstance(type, null); 

var result = method.Invoke(instance, parameters); 

これはテストされていませんが、私はこれがあなたが求めている答えに対する一般的なアプローチだと考えています。

関連する問題