1

我有以下内容,有时我需要FailuresValidations. 我们假设每个派生自的类型都有Validation一个且只有一个派生自上述实现的类型。Failure<T>TValidation

由于我有越来越多的实现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>given派生的类型T。我能够实例化Failure<T>( Failure1, Failure2, 等...),但我找不到如何调用我新创建的实例link的公共字段(通过使所有对我有意义的使用, ,等... )referenceFailureGetMethodMakeGenericMethodInvoke

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 {
...
}
4

2 回答 2

1

让Failures以与和相同的方式实现非通用IFailure接口以及通用接口IEnumerableIEnumerable<T>

在其中创建一个抽象工厂方法ValidationRule,每个具体的验证都必须实现该方法

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

    ...
}
于 2012-11-12T17:34:36.340 回答
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);
    }
}
于 2012-11-12T17:34:50.240 回答