[英]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>
( Failure1
、 Failure2
等...),但我找不到如何在我新創建的Failure
實例的公共字段reference
上調用link
(通過使用所有有意義的我的GetMethod
, MakeGenericMethod
, Invoke
等...)
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 {
...
}
讓失敗以與IEnumerable
和IEnumerable<T>
相同的方式實現非通用IFailure
接口以及通用接口
在ValidationRule
中創建一個抽象工廠方法,該方法必須由每個具體的 Validation 實現
public ValidationRule1 : ValidationRule
{
public override IFailure ToFailure()
{
return new Failure1(this);
}
...
}
link
是私有的,因為您沒有指定不同的可訪問性。 public
或internal
:
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.