0

私はC#が初めてで、次の問題があります:

Collection から継承する TypeCollection を作成する必要があります。ここにあるオブジェクトのタイプは、私が作成したいくつかのタイプです。

InsertItem() オーバーロードされたメソッドで、オブジェクトが作成した特定の型階層からのものであるかどうかを確認したい、そうでない場合は例外をスローします。

コード スニペットが添付されています。

public class ObjectTypeCollection<Type> : Collection<Type>
{
    protected override void InsertItem(int index, Type item)
    {   
        if(!(Utility.IsFDTObject(item.GetType())))
        {          
            throw new ArgumentException(string.Format("Type {0} is not valid", item.ToString()));
        }
        base.InsertItem(index, item);
    }
}

ここでの問題は、アイテム インスタンスにあります。現在渡されているタイプを取得できるメソッドはありません。GetType() は、渡した型を返しません。現在、私は使用しています:

System.Type typ = System.Type.GetType(item.ToString()); 

タイプを取得してから、これを Utility メソッドに渡します。これはうまくいきます。これは正しいアプローチですか?

ここで私を助けてくれませんか?

4

4 に答える 4

1

type parameter に制約を設定できますType。こちらを参照してください: http://msdn.microsoft.com/en-us/library/d5x73970(v=vs.80).aspx

これは静的にチェックされ、現在行っているような動的なことを行う必要はありません。具体的には:

public class ObjectTypeCollection<T> : Collection<T> where T : <base class name>

于 2012-04-23T09:52:56.487 に答える
0

Type.IsAssignableFromメソッド を使用します。

public class FDTObject {}
public class MyDTObject1 : FDTObject {}
public class MyDTObject2 : FDTObject { }

public class ObjectTypeCollection : Collection<Type>
{
    protected override void InsertItem(int index, Type item)
    {
        if (!typeof(FDTObject).IsAssignableFrom(item))
        {
            throw new ArgumentException(string.Format("Type {0} is not valid", item));
        }
        base.InsertItem(index, item);
    }
}

使用法:

var collection = new ObjectTypeCollection();  
collection.Add(typeof(MyDTObject1)); // ok  
collection.Add(typeof(MyDTObject2)); // ok  
collection.Add(typeof(String)); // throws an exception  
于 2012-04-23T10:05:29.647 に答える
0

Type.IsAssignableFromType のインスタンスが別の Type のインスタンスから割り当て可能かどうか (互換性がある場合) を確認するために使用できます。このような:

if (typeof(FDTObject).IsAssignableFrom(item))

しかし、あなたの質問は少し不明確です。実際の型ではなく、特定の型のオブジェクトを挿入して、コレクションをさまざまな型でインスタンス化できるようにしたいのではないでしょうか? 次に、クラスのジェネリック パラメーターを制約できます。

public class ObjectTypeCollection<T> : Collection<T> where T: FDTObject

または、すべてのオブジェクトが FDTObject またはその子孫であるコレクションが必要です。次に、 aList<FDTObject>を使用するだけで、即座に静的型チェックを行うことができます(それが意図したものである場合の最良の解決策):

List<FDTObject> fdtList = new List<FDTObject>();

私にとっては、それはまだかなり不明です。のインスタンスをコレクションに追加しますかSystem.Type(その場合、クラス名の直後にある最初のジェネリック引数を削除する必要があります)? それとも、たまたまTypeジェネリック パラメータの名前として選択したのでしょうか (つまり、System.Typeそのような名前の型が既に存在するため、これは不適切な選択です)。

于 2012-04-23T09:55:37.047 に答える
0

Unless I am missunderstanding what you want, can't you just use the generic list?

You can initialize the list with the type parameter set to your base class:

var list = new List<FDTObject>(); // assuming this is one of your base classes based upon your example.

you can then add any object to the list that is an FDTObject or inherits from FDTObject

于 2012-04-23T10:06:47.780 に答える