Как создать коллекцию типа MyCollection <T>: IList <Alert <T>>? - PullRequest
0 голосов
/ 05 февраля 2010

У меня есть Alert <T> объект. Предположим, я хочу получить все оповещения для типа MyObject, У меня была бы коллекция типа MyCollection<MyObject> : IList<Alert<MyObject>>.

Как бы я реализовал методы для этого списка?

Ответы [ 4 ]

1 голос
/ 05 февраля 2010

Позвольте мне сначала спросить вас, зачем создавать свою собственную коллекцию? Вам это действительно нужно? Если это так, вы можете взглянуть на MSDN здесь и здесь , если не используете какой-либо из общих классов коллекции, которые уже есть в платформе.

0 голосов
/ 10 февраля 2010

Мне кажется, я нашел важный фрагмент того, что искал:

 entityObject = objectContext.GetEntityByKey<T>(id);

универсальный метод получения сущностей из текста данных

0 голосов
/ 05 февраля 2010

Я думаю, что нашел решение, хотя у меня еще не было возможности его протестировать.

public class Base
{

    private delegate Base ConstructorDelegate(int someParam);

    public class ClassReference
    {
        Type currentType = typeof(Base);

        public Base Create<U>() where U : Base
        {
            ConstructorInfo ci = currentType.GetConstructor(BindingFlags.Instance |
            BindingFlags.Public, null, Type.EmptyTypes, null);
            DynamicMethod dm = new DynamicMethod("CreateInstance", typeof(Base), Type.EmptyTypes, typeof(ClassReference));
            ILGenerator il = dm.GetILGenerator();
            il.Emit(OpCodes.Newobj, ci);
            il.Emit(OpCodes.Ret);
            ConstructorDelegate del = (ConstructorDelegate)dm.CreateDelegate(typeof(ConstructorDelegate));
            return del();
        }

        public Base Create<U>(int someParam) where U : Base
        {
            ConstructorInfo ci = currentType.GetConstructor(BindingFlags.Instance |
            BindingFlags.Public, null, new Type[] { typeof(int) }, null);
            DynamicMethod dm = new DynamicMethod("CreateInstance", typeof(Base), new Type[] {
            typeof(int) }, typeof(ClassReference));
            ILGenerator il = dm.GetILGenerator();
            il.Emit(OpCodes.Ldarg_0);
            il.Emit(OpCodes.Newobj, ci);
            il.Emit(OpCodes.Ret);
            ConstructorDelegate del = (ConstructorDelegate)dm.CreateDelegate(typeof(ConstructorDelegate));
            return del(someParam);
        }

        private ClassReference(Type type)
        {
            currentType = type;
        }
        internal ClassReference() { }

        public static implicit operator ClassReference(Type input)
        {
            if (!typeof(Base).IsAssignableFrom(input))
                throw new Exception(String.Format("Type {0} must derive from {1}", input,
                typeof(Base)));
            return new ClassReference(input);
        }
    }


}

от c # версии Джоанны Картер Delphis Meta Class

0 голосов
/ 05 февраля 2010

Полагаю, решение должно быть неким динамическим конструктором.

...