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);
    }
    }

  • 相关阅读:
    linux 软件多版本共存
    git new
    centos 7 重新设置分区大小
    yum 多线程插件,apt多线程插件
    配置opencv cmake
    cmake 配置
    OpenCV 静态库 CMAKE 文件
    cron
    开课啦
    pytorch转onnx问题
  • 原文地址:https://www.cnblogs.com/huangcong/p/1934004.html
Copyright © 2011-2022 走看看