簡體   English   中英

在通用字段上調用通用方法?

[英]Calling Generic Method on Generic Field?

我有以下內容,在某些時候我需要為Validations創建Failures 我們假設從Validation派生的每個類型都有一個並且只有一個類型從Failure<T>派生而來,其中T是上述Validation實現。

由於我有越來越多的Validation實現,我需要能夠實例化從Failure<T>,派生的正確類型Failure<T>,並在一個看起來像的方法中調用它的link方法

void recordFailureForValidation(Validation v) {
   Type failureType = dict[v.GetType()];
   Object failure = Activator.CreateInstance(failureType);
       // how do I call failure.link(v) ?
}

在運行時,字典給了我從給定T Failure<T>派生的類型。 我能夠實例化Failure<T>Failure1Failure2等...),但我找不到如何在我新創建的Failure實例的公共字段reference上調用link (通過使用所有有意義的我的GetMethodMakeGenericMethodInvoke等...)

public class MyReferenceClass<T>
  where T : Object, new() {
   public void link(T arg) { ... }
}

public abstract class Failure<T>
   where T : ValidationRule, new() {
...
   public MyReferenceClass<T> reference;
...
}

public class Failure1 : Failure<Validation1> {
}

public class Failure2 : Failure<Validation2> {
}


public abstract class ValidationRule {
   ...
}

public class ValidationRule1 : ValidationRule {
...
}

public class ValidationRule2 : ValidationRule {
...
}

讓失敗以與IEnumerableIEnumerable<T>相同的方式實現非通用IFailure接口以及通用接口

ValidationRule中創建一個抽象工廠方法,該方法必須由每個具體的 Validation 實現

public ValidationRule1 : ValidationRule
{
    public override IFailure ToFailure()
    {
        return new Failure1(this);
    }

    ...
}

link是私有的,因為您沒有指定不同的可訪問性。 publicinternal

public class MyReferenceClass<T>
  where T : Object, new() {
   public void link(T arg) { ... }
}

那么你可以通過引用屬性從Failure<T>調用它:

public abstract class Failure<T>
   where T : ValidationRule, new()
{
    protected T Validation {get; set;};
    public MyReferenceClass<T> reference;
}

public class Failure1 : Failure<Validation1>
{
    public void Test()
    {
        this.reference.link(Validation);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM