IsConst 类 
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
指示修饰的类型有一个 const 修饰符。 此类不能被继承。
public ref class IsConst abstract sealedpublic static class IsConsttype IsConst = classPublic Class IsConst- 继承
- 
				IsConst
示例
以下示例演示如何使用反射向程序集发出 IsConst 对象。
#using <mscorlib.dll>
using namespace System;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
using namespace System::Runtime::CompilerServices;
using namespace System::Threading;
ref class CodeEmitter
{
private:
    AssemblyBuilder^ asmBuilder;
    String^ asmName;
    ModuleBuilder^ modBuilder;
    void prepareAssembly(String^ name){
        
        // Check the input.
        if(!name){
        
            throw gcnew ArgumentNullException("AssemblyName");
        }
        asmName = name;
        // Create an AssemblyName object and set the name.
        AssemblyName^ asmName = gcnew AssemblyName();
        asmName->Name = name;
        // Use the AppDomain class to create an AssemblyBuilder instance.
        AppDomain^ currentDomain = Thread::GetDomain();
        asmBuilder = currentDomain->DefineDynamicAssembly(asmName,AssemblyBuilderAccess::RunAndSave);
        // Create a dynamic module.
        modBuilder = asmBuilder->DefineDynamicModule(name);
    }
public:
    // Constructor.
    CodeEmitter(String ^ AssemblyName){
        prepareAssembly(AssemblyName);
    }
    // Create a new type.
    TypeBuilder^ CreateType(String^ name){
       
        // Check the input.
        if(!name){
        
            throw gcnew ArgumentNullException("AssemblyName");
        }
        return modBuilder->DefineType( name );
    }
    // Write the assembly.
    void WriteAssembly(MethodBuilder^ entryPoint){
    
        // Check the input.
        if(!entryPoint){
        
            throw gcnew ArgumentNullException("entryPoint");
        }
        asmBuilder->SetEntryPoint( entryPoint );
        asmBuilder->Save( asmName );
    }
};
void main()
{
    // Create a CodeEmitter to handle assembly creation.
    CodeEmitter ^ e = gcnew CodeEmitter("program.exe");
    // Create a new type.
    TypeBuilder^ mainClass = e->CreateType("MainClass");
    
    // Create a new method.
    MethodBuilder^ mBuilder = mainClass->DefineMethod("mainMethod", MethodAttributes::Static);
    // Create an ILGenerator and emit IL for 
    // a simple "Hello World." program.
    ILGenerator^ ilGen = mBuilder->GetILGenerator();
    ilGen->Emit(OpCodes::Ldstr, "Hello World");
    array<Type^>^mType = {String::typeid};
    MethodInfo^ writeMI = Console::typeid->GetMethod( "WriteLine", mType );
    ilGen->EmitCall(OpCodes::Call, writeMI, nullptr );
    ilGen->Emit( OpCodes::Ret );
    /////////////////////////////////////////////////
    /////////////////////////////////////////////////
    // Apply a required custom modifier
    // to a field.
    /////////////////////////////////////////////////
    /////////////////////////////////////////////////
    array<Type^>^fType = {IsConst::typeid};
    mainClass->DefineField("modifiedInteger", Type::GetType("System.Int32"), fType, nullptr, FieldAttributes::Private);
    // Create the type.
    mainClass->CreateType();
    // Write the assembly using a reference to 
    // the entry point.
    e->WriteAssembly(mBuilder);
    Console::WriteLine(L"Assembly created.");
}
注解
Microsoft C++ 编译器将此修饰符发送到源代码中声明为 const 的任何参数、返回类型或对象声明的元数据中。
编译器在元数据中发出自定义修饰符,以更改实时 (JIT) 编译器在默认行为不适用时处理值的方式。 当 JIT 编译器遇到自定义修饰符时,它将按照修饰符指定的方式处理值。 编译器可以将自定义修饰符应用于方法、参数和返回值。 JIT 编译器必须响应所需的修饰符,但可以忽略可选修饰符。
可以使用以下技术之一向元数据发出自定义修饰符:
- 在 类中使用 TypeBuilder 方法,例如 DefineMethod、 DefineField、 DefineConstructor和 DefineProperty。 
- 生成 Microsoft 中间语言 (MSIL) 指令文件,该文件包含 对 - modopt和- modreq的调用,并使用 Ilasm.exe (IL 汇编程序) 组合文件。
- 使用非托管反射 API。