2016-08-29 76 views
0

調用靜態場法的靜態類我有這個規範靜態類:使用如何使用反射

public class Specification<T> : ISpecification<T> 
{ 
    private Func<T, bool> expression; 
    public Specification(Func<T, bool> expression) 
    { 
     if (expression == null) 
      throw new ArgumentNullException(); 
     else 
      this.expression = expression; 
    } 

    public bool IsSatisfiedBy(T o) 
    { 
     return this.expression(o); 
    } 
} 

我怎麼能說TestSpec.IsSatisfiedBy(SOMETYPE):

public static class OperationSpecs 
{ 

    public static ISpecification<TestEntity> TestSpec = new Specification<TestEntity>(
     o => 
     { 

      return (o.Param1== 1 && 
        o.Param2== 3 
       ); 
     } 
    ); 

規範實施反思?我嘗試這樣做:

  var specAttr = op.GetCustomAttribute<OperationSpecificationAttribute>(); 
      var specType = specAttr.SpecificationType; 
      var specTypeMethodName = specAttr.SpecificationMethodName; 
      var specField = specType.GetField(specTypeMethodName, BindingFlags.Public | BindingFlags.Static); 

      if (specField != null) 
      { 
       var specFieldType = specField.FieldType; 
       var result2 = specField.GetValue(null).GetType().GetMethod("IsSatisfiedBy").Invoke(null, new object[] { entity }); 
      } 

我遇到錯誤時要調用調用非靜態方法需要一個目標......我需要布爾結果.. 感謝您的幫助!

+0

只是一個題外話的話:我雙頭呆您的個人資料,看看你從來沒有獎勵或贊成票正確答案。爲了保持每個人的積極性,請將最佳答案投票表決,或者如果答案是正確答案,請勾選灰色勾號。 :) –

回答

2

您正試圖使用​​反射調用方法IsSatisfiedBy。與您的標題相反,此方法不是靜態方法,而是實例方法。你需要調用的方法與它的實例:

var instance = specField.GetValue(null); 
var instanceType = instance.GetType(); 
var methodInfo = instanceType.GetMethod("IsSatisfiedBy"); 
var result2 = methodInfo.Invoke(instance, new object[] { entity }); // <<-- instance added. 

或簡稱:

var instance = specField.GetValue(null); 
var result2 = instance.GetType().GetMethod("IsSatisfiedBy").Invoke(instance, new object[] { entity }); 
+0

非常感謝,作品! +1 –