1. ホーム
  2. c#

[解決済み】C# : 'is' キーワードとNotのチェック

2022-03-27 04:10:44

質問

これは愚問ですが、このコードを使って、何かが特定のタイプであるかどうかをチェックすることができます...

if (child is IContainer) { //....

もっとエレガントな方法で "NOT" のインスタンスをチェックすることはできますか?

if (!(child is IContainer)) { //A little ugly... silly, yes I know...

//these don't work :)
if (child !is IContainer) {
if (child isnt IContainer) { 
if (child aint IContainer) { 
if (child isnotafreaking IContainer) { 

はい、はい...愚問です...。

なぜなら、何らかの疑問があるからです のようなコードに見えますが、これはメソッドの最初にある単純な戻り値に過ぎません。

public void Update(DocumentPart part) {
    part.Update();
    if (!(DocumentPart is IContainer)) { return; }
    foreach(DocumentPart child in ((IContainer)part).Children) {
       //...etc...

解決方法は?

if(!(child is IContainer))

は、唯一の演算子です。 IsNot 演算子)。

それを行う拡張メソッドを構築することができます。

public static bool IsA<T>(this object obj) {
    return obj is T;
}

にして、それを使って

if (!child.IsA<IContainer>())

そして、あなたのテーマでフォローすることができました。

public static bool IsNotAFreaking<T>(this object obj) {
    return !(obj is T);
}

if (child.IsNotAFreaking<IContainer>()) { // ...


更新(OPのコードスニペットを考慮)。

実際に値を後からキャストしているのだから、単に as の代わりに

public void Update(DocumentPart part) {
    part.Update();
    IContainer containerPart = part as IContainer;
    if(containerPart == null) return;
    foreach(DocumentPart child in containerPart.Children) { // omit the cast.
       //...etc...