zoukankan      html  css  js  c++  java
  • 黄聪:InvokeMember 访问一种类型的成员。

    using System;
    using System.Reflection;

    // This sample class has a field, constructor, method, and property.
    class MyType
    {
    Int32 myField;
    public MyType(ref Int32 x) {x *= 5;}
    public override String ToString() {return myField.ToString();}
    public Int32 MyProp
    {
    get {return myField;}
    set
    {
    if (value < 1)
    throw new ArgumentOutOfRangeException("value", value, "value must be > 0");
    myField
    = value;
    }
    }
    }

    class MyApp
    {
    static void Main()
    {
    Type t
    = typeof(MyType);
    // Create an instance of a type.
    Object[] args = new Object[] {8};
    Console.WriteLine(
    "The value of x before the constructor is called is {0}.", args[0]);
    Object obj
    = t.InvokeMember(null,
    BindingFlags.DeclaredOnly
    |
    BindingFlags.Public
    | BindingFlags.NonPublic |
    BindingFlags.Instance
    | BindingFlags.CreateInstance, null, null, args);
    Console.WriteLine(
    "Type: " + obj.GetType().ToString());
    Console.WriteLine(
    "The value of x after the constructor returns is {0}.", args[0]);

    // Read and write to a field.
    t.InvokeMember("myField",
    BindingFlags.DeclaredOnly
    |
    BindingFlags.Public
    | BindingFlags.NonPublic |
    BindingFlags.Instance
    | BindingFlags.SetField, null, obj, new Object[] {5});
    Int32 v
    = (Int32) t.InvokeMember("myField",
    BindingFlags.DeclaredOnly
    |
    BindingFlags.Public
    | BindingFlags.NonPublic |
    BindingFlags.Instance
    | BindingFlags.GetField, null, obj, null);
    Console.WriteLine(
    "myField: " + v);

    // Call a method.
    String s = (String) t.InvokeMember("ToString",
    BindingFlags.DeclaredOnly
    |
    BindingFlags.Public
    | BindingFlags.NonPublic |
    BindingFlags.Instance
    | BindingFlags.InvokeMethod, null, obj, null);
    Console.WriteLine(
    "ToString: " + s);

    // Read and write a property. First, attempt to assign an
    // invalid value; then assign a valid value; finally, get
    // the value.
    try
    {
    // Assign the value zero to MyProp. The Property Set
    // throws an exception, because zero is an invalid value.
    // InvokeMember catches the exception, and throws
    // TargetInvocationException. To discover the real cause
    // you must catch TargetInvocationException and examine
    // the inner exception.
    t.InvokeMember("MyProp",
    BindingFlags.DeclaredOnly
    |
    BindingFlags.Public
    | BindingFlags.NonPublic |
    BindingFlags.Instance
    | BindingFlags.SetProperty, null, obj, new Object[] {0});
    }
    catch (TargetInvocationException e)
    {
    // If the property assignment failed for some unexpected
    // reason, rethrow the TargetInvocationException.
    if (e.InnerException.GetType() !=
    typeof(ArgumentOutOfRangeException))
    throw;
    Console.WriteLine(
    "An invalid value was assigned to MyProp.");
    }
    t.InvokeMember(
    "MyProp",
    BindingFlags.DeclaredOnly
    |
    BindingFlags.Public
    | BindingFlags.NonPublic |
    BindingFlags.Instance
    | BindingFlags.SetProperty, null, obj, new Object[] {2});
    v
    = (Int32) t.InvokeMember("MyProp",
    BindingFlags.DeclaredOnly
    |
    BindingFlags.Public
    | BindingFlags.NonPublic |
    BindingFlags.Instance
    | BindingFlags.GetProperty, null, obj, null);
    Console.WriteLine(
    "MyProp: " + v);
    }
    }

  • 相关阅读:
    SQL Server Audit监控触发器状态
    SQL Server 数据变更时间戳(timestamp)在复制中的运用
    SQL Server 更改跟踪(Chang Tracking)监控表数据
    SQL Server 变更数据捕获(CDC)监控表数据
    SQL Server 事件通知(Event notifications)
    SQL Server 堆表行存储大小(Record Size)
    SQL Server DDL触发器运用
    SQL Server 默认跟踪(Default Trace)
    SQL Server 创建数据库邮件
    SQL Server 跨网段(跨机房)FTP复制
  • 原文地址:https://www.cnblogs.com/huangcong/p/1934004.html
Copyright © 2011-2022 走看看