Rambler's Top100
Главная
Новости
Статьи
Форумы
Книги
Коды
Сообщество
Блоги
О нас
 

Логин

Email:
  Пароль:

Войти
Зарегистрироваться
Забыл пароль

Поиск

 Искать :
 
Вперед

Сообщение

Kaer


Ухохатыватель

Зарегистрирован:
20 October 2003
Сообщения: 970
Примеры кода: 0
 

Флаг override для MethodBuilder'a

01 June 2005 20:53  


Пусть у нас есть абстрактный класс:
public abstract class HelloWorldAbstract
{
	public abstract void HelloWorld();
}
Для него, используя Reflection.Emit мы хотим создать наследника реализующего этот абстрактный метод:
public static Type GetHelloWorldType()
{
	AssemblyName assemblyName = new AssemblyName();
	assemblyName.Name = "HelloWorldAssembly";
	string asmFileName = "HelloWorldModule.dll";
	AssemblyBuilder assemblyBuilder =
		AppDomain.CurrentDomain.DefineDynamicAssembly(
			assemblyName, AssemblyBuilderAccess.RunAndSave, @"D:\Projects\ReflectionEmitLearning\bin" );

	ModuleBuilder moduleBuilder =
		assemblyBuilder.DefineDynamicModule( "HelloWorldModule", asmFileName );

	TypeBuilder typeBuilder =
		moduleBuilder.DefineType( "HelloWorldClass"
		                          , TypeAttributes.Public, typeof(HelloWorldAbstract) );

	MethodBuilder methodBuilder =
		typeBuilder.DefineMethod( "HelloWorld"
		                          , MethodAttributes.Public
		                          , null, null );

	ILGenerator il = methodBuilder.GetILGenerator();

	// Генерируем код.

	MethodInfo getCurrentContextMI = typeof(HttpContext).
		GetMethod( "get_Current" );

	MethodInfo getResponseMI = typeof(HttpContext).
		GetMethod( "get_Response" );

	MethodInfo responseWriteMI = typeof(HttpResponse).
		GetMethod( "Write", new Type[] {typeof (string)} );
			
	il.EmitCall( OpCodes.Call, getCurrentContextMI, null );
	il.EmitCall( OpCodes.Callvirt, getResponseMI, null );
	il.Emit( OpCodes.Ldstr, "Hello World!" );
	il.EmitCall( OpCodes.Callvirt, responseWriteMI, null );
	il.Emit( OpCodes.Ret );

	Type result = typeBuilder.CreateType();
	assemblyBuilder.Save( asmFileName );

	return result;
}
В отмеченном месте генерится ошибка, говорящая о том, что абстрактный метод HelloWorld не был реализован. Я так понимаю, что в это месте:
	MethodBuilder methodBuilder =
		typeBuilder.DefineMethod( "HelloWorld"
		                          , MethodAttributes.Public
		                          , null, null );

необходимо добавить еще какой-то MethodAttribute. Однако значения 'Override' для этого перечисления я так и не увидел. А все остальные варианты кажутся не подходящими Сарказм Можете помочь решить проблему?
Наверх
  



Общие вопросы программирования на ASP.NET

 Флаг override для MethodBuilder'aKaer  01 June 2005 20:53
 RE: Флаг override для MethodBuilder'aKaer  02 June 2005 09:26
 
Наш Киев

Apartments for Rent

Rambler's Top100
Рейтинг@Mail.ru
Идея: Dimon aka Manowar Программирование: Dimon aka Manowar Дизайн: Dan Lebedev
Хостинг от компании Parking.ru
Карта сайта