1

私は次のものを持っており、ある時点で のために作成する必要がありFailuresますValidations。から派生する各型には、前述の の実装であるwhereValidationから派生する型が 1 つだけあると仮定します。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から派生した型を教えてくれますTFailure<T>( Failure1、 、など...)をインスタンス化することはできますが、新しく作成したインスタンスの public フィールドFailure2を呼び出す方法が見つかりません( 、、などの意味のあるすべての用途を使用することによって)。 )linkreferenceFailureGetMethodMakeGenericMethodInvoke

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インターフェイスとジェネリック インターフェイスを同じ方法で実装さIEnumerableせます。IEnumerable<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 に答える