2

私はC#が初めてで、次のことについて確信が持てません: 次のように定義されたパラメータがあります:

public Collection<object> InputObject
        {
            get { return inputObject; }
            set { inputObject= value; }
        }
        private Collection<object> inputObject;

ご覧のとおり、オブジェクトはさまざまなタイプを想定しているため、オブジェクトのコレクションです。

後でタイプを確認したい場合、正しい方法は何ですか? 私はこれを試しました:

if (inputObject is Collection<MyDefinedObject>)
{

}

しかし、指定された式が期待されるタイプではないという下線付きの警告が表示されます。コレクション内の型を確認する正しい方法は何ですか?

ありがとう

4

6 に答える 6

4

オブジェクトのコレクションがあります

あなたが書くとき

Collection<object>

これは、任意のオブジェクト を含むことができるコレクションを定義していることを意味します。

それを行うと、次のようなことができます

inputObject.Add(new MyDefinedObject());
inputObject.Add(new StringBuilder()));

コレクションにはさまざまなタイプがあります。

コレクションの特定の要素を確認する

そのコレクション内の特定のオブジェクトのタイプをテストしたい場合は、次のようにすることができます

Type t = inputObject[0].GetType();

また

if (inputObject[0] is MyDefinedObject)

コード

if (inputObject is Collection<MyDefinedObject>)

すでに定義されているため、真になることはありません

private Collection<object> inputObject;

コレクションinputObjectの型を定義したことを意味しますCollection<object>

コレクション内のすべてを MyDefinedObject にしたい場合はどうすればよいですか?

質問の下のコメントに基づいて、これはあなたが本当に望んでいるものです...

private Collection<MyDefinedObject> inputObject;

表示されるエラー メッセージ

しかし、指定された式が期待されるタイプではないという下線付きの警告が表示されます

これは、inputObject がCollectionCollection<object>ではないtype であるためです。それは、リンゴは決してバナナではないと言っているようなものです。

より良いアプローチ

ジェネリックを使用していて、ジェネリック コレクションを受け取っている場合、そのコレクションを処理するジェネリック関数を作成してみませんか?

private void ProcessCollection<T>(Collection<T> inputObject)
{
}

// Somewhere else in your code...

Collection<MyDefinedObject> inputObject = // Initialize this however you do now
ProcessCollection<MyDefinedObject>(inputObject);
于 2012-07-25T19:16:26.273 に答える
2

Collection<>containsであるためobject、コレクションには (本質的に) タイプがありません。コレクションに実際のタイプを指定するか、コレクション内のアイテムのタイプをチェックします。

于 2012-07-25T19:15:28.787 に答える
1

すべてをチェックする必要があります。コレクションはオブジェクトとして定義されます

foreach (object obj in InputObject)
{
    obj.gettype();     
    if (obj is DocFieldEnumHierTwoSpeedLoader) x= 5;
}
于 2012-07-25T19:20:05.307 に答える
1

すべてのオブジェクトは基本クラスオブジェクトを継承し、次を使用できます。

if(InputObject[0].GetType()==typeof(string)){
//string is an example and 0 can be replaced with a index
}

どのタイプが各オブジェクトであるかを知るため

于 2012-07-25T19:17:12.197 に答える
0

inputObjectプロパティには、コレクションタイプが時々変化する可能性のあるコレクションを含めることができると言います。2つの解決策があります:

1)コレクションの要素のタイプが、プロパティを定義するタイプの特定のインスタンスで常に同じである場合は、そのタイプをジェネリックにします。

public class MyClass<T>
{
    public Collection<T> InputObject 
    { 
        get { return inputObject; } 
        set { inputObject= value; } 
    } 
    private Collection<T> inputObject; 
}

プロパティの同じインスタンスがさまざまな要素タイプのコレクションを保持できる場合は、フィールドをobject、、またはおそらくより適切な非ジェネリックインターフェイスタイプとして宣言します。

public class MyClass
{
    public ICollection InputObject
    {
        get { return inputObject; } 
        set { inputObject= value; }  // you should add some type checking here 
                                     //to make sure an invalid collection type isn't passed in
    }
    private ICollection inputObject;
    public Collection<T> GetTypedCollection<T>()
    {
        return (Collection<T>)inputObject; 
    }
}

GetTypedCollectionメソッドでは、コンパイル時にコレクションのタイプを知っている必要があります。それが不可能な場合は、解決策を提案できるように、さらにサンプルコードを投稿する必要があります。

于 2012-07-25T19:45:22.990 に答える
0

おそらくこれはあなたが望むものです:

        var defined = InputObject.OfType<MyDefinedObject>();
        var other = InputObject.OfType<MyOtherDefinedObject>();

        bool hasDefined = defined.Any();
        bool hasOther = other.Any();
于 2012-07-25T19:44:24.857 に答える