0

この方法でインターフェイスの実装を確認することは可能ですか?

class ProjectSettingsApplier : ISettingsApplier, IApplyChanges
{
}


ISettingsApplier applier = new ProjectSettingsApplier()
if(applier is IApplyChanges)
{
    //Is it true??
}
4

4 に答える 4

4

ドキュメントからis:

is 式は、指定された式が null でない場合に true と評価され、例外をスローすることなく、指定されたオブジェクトを指定された型にキャストできます。それ以外の場合、式は false と評価されます。

だから私はそう言うでしょう、それはうまくいくでしょう。

とはいえ、単純な再現がこれに答える可能性があります。

于 2013-07-03T15:20:29.370 に答える
2

はい、それは有効であり、チェックを行う良い方法のようです。

すべてIApplyChangesISettingsAppliersでもある場合はIApplyChanges : ISettingsApplier、関係を明確にするために、 を作成する必要があります。

于 2013-07-03T15:20:21.057 に答える
2

はい、applier実際に実装しているので合法IApplyChangesです。その場合、評価は になりますtrue

または、使用することもできますIsAssignableFromが、それはもっとおしゃべりであり、applier がそうでないことを確認する必要がありますnull

typeof(IApplyChanges).IsAssignableFrom(applier.GetType());
于 2013-07-03T15:20:33.540 に答える
0

それはまったく問題ありませんが、インターフェイスをキャストしIApplyChangesて使用したい場合は、as代わりに次のisように使用する必要があります。

ISettingsApplier applier = new ProjectSettingsApplier()

var changer = applier as IApplyChanges;

if (changer != null) // Will only be non-null if it implements IApplyChanges
{
    // Use changer.
}

このようにすると、効率的ではない二重の型チェックが回避されます。つまり、次のようにしないでください。

ISettingsApplier applier = new ProjectSettingsApplier()

if (applier is IApplyChanges) // Type check #1
{
    var changer = (IApplyChanges) applier; // Type check #2: Inefficient.
    // Use changer.
}
于 2013-07-03T15:28:41.170 に答える