在通用字段上调用泛型方法?

时间:2012-11-12 17:17:45

标签: c# reflection

我有以下内容,在某些时候我需要为Failures创建Validations。我们假设从Validation派生的每种类型都有一种且只有一种类型派生自Failure<T>,其中T是上述Validation的实现。

由于Validation的实现越来越多,我需要能够实例化从Failure<T>,派生的正确类型,并在一个方法中调用link方法。看起来像

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

在运行时,字典为我提供了来自Failure<T>给定T的类型。 我能够实例化Failure<T>Failure1Failure2等...),但我找不到如何在公共字段{{1}上调用link我新创建的reference个实例(通过对我FailureGetMethodMakeGenericMethod等进行所有有用的使用...)

Invoke

2 个答案:

答案 0 :(得分:1)

让失败以与IFailureIEnumerable

相同的方式实现非通用IEnumerable<T>接口以及通用接口

ValidationRule中创建一个必须由每个具体验证

实现的抽象工厂方法
public ValidationRule1 : ValidationRule
{
    public override IFailure ToFailure()
    {
        return new Failure1(this);
    }

    ...
}

答案 1 :(得分:1)

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);
    }
}