1

Cシャープの反射について質問です。これは私の質問です

MyClass1)異なるアクセサー(プライベート、パブリック、プロテクト)を持つ異なるフィールドを持つクラスを定義し、異なる引数セットと戻り値の型を持つメソッドも定義します

2)MyTestClassどのメソッドを含むかを定義します。これは、次のことを行います: 特定されたクラス名のメソッド名を出力します。メソッドには文字列引数が含まれ、クラス名は文字列値です。クラスのいくつかのメソッドを呼び出し、メソッドに引数を入れます。引数はテキストファイルから読み取る必要があります(クラスの名前とメソッドの名前はメソッドの引数です

クラスで method5 を呼び出したいのですが、2 つのパラメーターが必要で、しようとするとカウント パラメーターの不一致エラーが発生します。2 つのパラメーターを渡して呼び出しメソッドが機能するようにするにはどうすればよいintですdoubleか?

Inside params.txt there is

10 1.5

テキストファイルから読みたいのですが、これは私の完全なコードであり、アイデアや変更を歓迎します

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.IO;

class MyClass
{
    private int i;
    public double d;
    private string s;
    public bool b;
    public MyClass()
    {
        i = 1;
        d = 0.1;
        s = "1";
        b = true;
    }
    public void Method0()
    {
        Console.WriteLine("Method with no arguments, no return value.");
    }
    private int Method1(int arg0)
    {
        Console.WriteLine("The method returns int, int gets.");
        return arg0;
    }
    private double Method2(int arg0, double arg1)
    {
        Console.WriteLine("Method returns a double, taking int and double.");
        return arg1 * arg0;
    }
    public bool Method3(string arg0)
    {
        Console.WriteLine("Method returns a bool, accepts string");
        return arg0.Length>10;
    }
    public bool Method3(string arg0,string arg1)
    {
        Console.WriteLine("The method takes two arguments string.");
        return arg0 == arg1;
    }
    public static char Method4(string arg0)
    {
        Console.WriteLine("Method returns a char, accepts string. .");
        Console.WriteLine(arg0);
        return arg0[1];
    }
    public void Method5(int arg0, double arg1)
    {
        Console.WriteLine("arg1 = {0} arg2 = {1}.",arg0,arg1);
    }
}

class MyTestClass
{
    public static string[] GetMethodsWithStrParams(string className)
    {
        var t = Type.GetType(className);
        List<string> res = new List<string>();
        foreach (var method in t.GetMethods())
        {
            foreach (var param in method.GetParameters())
            {
                if (param.ParameterType == typeof(string))
                {
                    res.Add(method.Name);
                    break;
                }
            }
        }
        return res.ToArray();
    }
    public static void InvokeMethod(string className, string methodName, string fileName)
    {
        var t = Type.GetType(className);
        using (StreamReader f = new StreamReader("params.txt"))
        {
            t.GetMethod(methodName).Invoke(t.GetConstructor(Type.EmptyTypes).Invoke(new object[] { }),
                                           new object[] { f.ReadLine(), f.ReadLine()+"1" });
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        string name = "MyClass";

        foreach (var x in MyTestClass.GetMethodsWithStrParams(name))
        {
            Console.WriteLine(x);
        }

        MyTestClass.InvokeMethod("MyClass", "Method5", "params.txt");

        Console.ReadKey(true);
    }
}
4

2 に答える 2

0

ファイルのすべての文字列を、メソッドで使用されるそれぞれの型に変換する必要があります。

using System;
using System.Linq;
using System.IO;

class MyInvokedClass
{
  public void MyInvokedMethod(int arg0, double arg1)
  {
    Console.WriteLine("arg1 = {0} arg2 = {1}.", arg0, arg1);
  }
}

class Program
{
  public static void InvokeMethod(string className, string methodName, string fileName)
  {
    string[] contents = File.ReadAllLines(fileName);

    var t = Type.GetType(className);
    var m = t.GetMethod(methodName);

    var parametertypes = m.GetParameters().Select(p => p.ParameterType);

    var parameters = parametertypes.Select((type, index) => Convert.ChangeType(contents[index], type)).ToArray();
    var instance = Activator.CreateInstance(t);

    m.Invoke(instance, parameters);
  }

  static void Main()
  {
    InvokeMethod("MyInvokedClass", "MyInvokedMethod", "params.txt");

    Console.ReadKey(true);
  }
}

ファイルは次のとおりです。

42
12.34

(正しく動作させるには、プログラムのカルチャで使用される小数点で . を置き換える必要がある場合があることに注意してください)

于 2013-04-10T14:00:18.353 に答える