Динамически сгенерированный класс, который реализует IENumerator GetEnumerator () и iEnumerator Ienumerable.Getenumerator ()

StackOverflow https://stackoverflow.com/questions/4162736

Вопрос

У меня проблема с рефлексией .emit. Я хочу иметь динамически созданный класс, который имеет простую реализацию stocolcept. Все методы, которые я определил нормально, вместо следующих двух: общедоступный iEnumerator Getenumerator () & Ienumerator ienumerable.getenumerator () Следующий код показывает, что я хочу быть в моем динамическом классе:

public class SomeClassThatIsIEnumerable<T> : IEnumerable<T>
{
    public IEnumerator<T> GetEnumerator()
    {...}

    IEnumerator IEnumerable.GetEnumerator()
    {...}

}

Этот вывод из отражателя открыл мою динамическую сборку:

public class SomeClassThatIsIEnumerable<T> : IEnumerable<T>
    {
        public IEnumerator<T> GetEnumerator()
        {
           ...
        }

        IEnumerator GetEnumerator()
        {
           ...
        }
    }

Я определяю свой класс таким способом:

TypeBuilder myType = module.DefineType("myType"...);
myType.AddInterfaceImplementation(typeof(IEnumerable));
myType.AddInterfaceImplementation(typeof(IEnumerable<T>));
myType.AddInterfaceImplementation(typeof(ICollection<T>));
myType.DefineMethodOverride(myDefineGetEnumerator(...),typeof(IEnumerable).GetMethod("GetEnumerator");
myType.DefineMethodOverride(myDefineGetGenericEnumerator(...),typeof(IEnumerable<T>).GetMethod("GetEnumerator);
//Definitions of other ICollection methods
//Define GetEnumerator is looks like this:
MethodBuilder method = myType.DefineMethod("GetEnumerator", MethodAttributes.Final | MethodAttributes.Virtual...)
ILGenerator il = method.GetILGenerator();
// adding opcodes

Когда я звоню mytype.createtype TypeLoadexception броски с сообщением Getenumerator метод не имеет реализации. Я предлагаю по проблеме с методом Ienumerable.getenumerator, потому что у меня были проблемы в написании его на C #, даже в IL :). Может кто-нибудь помочь мне?

Это было полезно?

Решение 2

Ответ следующий определяет метод

 MethodBuilder myMethod = myType.DefineMethod("System.Collections.IEnumerable.GetEnumerator",
                   MethodAttributes.Private | MethodAttributes.HideBySig |
                MethodAttributes.NewSlot | MethodAttributes.Virtual | 
                MethodAttributes.Final);

Мне было удивительно, что написание имени интерфейса во имя метода было бы установить уникальное отношение к интерфейсу

Другие советы

Похоже, вы должны использовать DefineMethod скорее, чем DefineMethodOverride. Отказ Есть Пример излучающего явного реализации интерфейса на MSDN. (Я не принял время, чтобы попробовать это, однако.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top