methodinfo(MethodInfoMakeGenericMethod)

http://www.itjxue.com  2023-02-12 19:58  来源:未知  点击次数: 

C# 如何将通过反射获得的 MethodInfo 类添加到 Dictionary 中

我不是很了解你的用意,不过你?试试看这个能不能给你思路!

但是我觉得你那一样反射去做的话就会造成所有的待用都只能调用到最后一个函数,因为你的委托只有一个,反射也是委托,你改变其中的一个,其他都会跟着变,结果就是public viod myProc_1(byte[] data) 被调用,其他的都调用不了,所以你的代码需要改造 如下

声明dic:

Dictionaryint, MethodInfo Func = new Dictionaryint, MethodInfo()

反射,假如你的方法在Demo类中,反射添加如下

try

??????????? {

??????????????? Demo demo = new Demo();

??????????????? MethodInfo[] methods = demo.GetType().GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);

??????????????? //获取想要的方法集合,"myProc"是方法查找关键字

??????????????? int i = 0;

??????????????? foreach (MethodInfo t in methods.Where(F = F.Name.Contains("myProc")))

??????????????? {

??????????????????? Func.Add(i,t);

??????????????????? i++;

??????????????? }

??????????? }

??????????? catch (Exception ex)

??????????? {

??????????????? MessageBox.Show(ex.Message);

??????????? }

调用:????????非静态方法

demo = new Demo();

??????????????? Func[0].Invoke(demo, new object[1] { new byte[1] });

??????????????? Func[1].Invoke(demo, new object[1] { new byte[2] });

如果是静态的方法

Func[0].Invoke(null, new object[1] { new byte[1] });

??????????????? Func[1].Invoke(null, new object[1] { new byte[2] });

就这样...

?

c# 中关于MethodBase Invoke方法!

MethodBase 的 Invoke 方法是一个抽象方法。

当在派生类中重写时,调用具有给定参数的反射的方法或构造函数。

MethodBase 是 MethodInfo 和 ConstructorInfo 的基类。

Invoke方法,有两个重载,功能就是调用指定的函数。

举个简单的例子,使用第一个重载,它的参数比较简单,只有两个参数。

public Object Invoke(

Object obj,

Object[] parameters

)

第一个参数:对其调用方法或构造函数的对象。如果方法是静态的,则忽略此参数。如果构造函数是静态的,则此参数必须为 nullNothingnullptrnull 引用(在 Visual Basic 中为 Nothing) 或定义该构造函数的类的实例。

第二个参数:调用的方法或构造函数的参数列表。这是一个对象数组,这些对象与要调用的方法或构造函数的参数具有相同的数量、顺序和类型。如果没有任何参数,则 parameters 应为 nullNothingnullptrnull 引用(在 Visual Basic 中为 Nothing)。

如果此实例所表示的方法或构造函数采用 ref 参数(在 Visual Basic 中为 ByRef),使用此函数调用该方法或构造函数时,该参数不需要任何特殊属性。如果数组中的对象未用值来显式初始化,则该对象将包含该对象类型的默认值。对于引用类型的元素,该值为 nullNothingnullptrnull 引用(在 Visual Basic 中为 Nothing)。对于值类型的元素,该值为 0、0.0 或 false,具体取决于特定的元素类型。

示例代码如下:

using System;

using System.Reflection;

namespace Demo

{

public class TestClass

{

public void Test1( string msg )

{

Console.WriteLine( "TestClass.Test1 Invoked with parameter( msg: {0} )", msg );

}

public int Test2( int a, string b, char c )

{

Console.WriteLine( "TestClass.Test2 Invoked with parameter( a: {0}, b: {1}, c: {2} )", a, b, c );

return a;

}

public static string Test3( string s )

{

Console.WriteLine( "TestClass.Test3 Invoked with parameter( s: {0} )", s );

return DateTime.Now.ToString();

}

public TestClass( int a, int b )

{

Console.WriteLine( "TestClass created with parameter( a: {0}, b: {1} )", a, b );

}

}

class Program

{

static void Main( string[] args )

{

Type testClassType = Type.GetType( "Demo.TestClass, Demo", false );

if ( testClassType != null )

{

object instance = Activator.CreateInstance( testClassType, 10, 20 );

MethodInfo test1 = testClassType.GetMethod( "Test1", BindingFlags.Instance | BindingFlags.Public );

test1.Invoke( instance, new object[] { "hello word!" } );

MethodInfo test2 = testClassType.GetMethod( "Test2", BindingFlags.Instance | BindingFlags.Public );

int result = ( int ) test2.Invoke( instance, new object[] { 1, "good", 'x' } );

Console.WriteLine( "result = {0}", result );

MethodInfo test3 = testClassType.GetMethod( "Test3", BindingFlags.Static | BindingFlags.Public );

string result1 = ( string ) test3.Invoke( null, new object[] { "test3" } );

Console.WriteLine( "result1 = {0}", result1 );

}

}

}

}

c#如何获取当前方法的参数值

public string demo()

{

return "demo";

}

Assembly ab = Assembly.GetExecutingAssembly();//得到当前运行的程序集

Type tp = ab.GetType("Test.Process");//得到指定的类,

MethodInfo mi = tp.GetMethod("demo");//得到方法“demo()”函数的信息

object ob = Activator.CreateInstance(tp);//对得到的tp实例化对象

调用ob对象的mi中的方法,null:没有参数;有参数:需要传入一个object数组

object res = mi.Invoke(ob,null);//

messagebox.show(res).

执行当前 Web 请求期间生成了未处理的异常.可以使用下面的异常堆栈跟踪信息确定

找你代码中的调用

String.SubString

方法的地方

=============================

System.String.Substring(Int32

startIndex)

+17

=============================

一般来说,你在用这个方法截取子字符串时,所指定的

开始位置或结束位置已经超出或低于(startIndex

=

-1)它的长度。

C#怎么把反射出来的MethodInfo赋值到委托里面

可以用System.Delegate.CreateDelegate

函数签名如下

public static Delegate CreateDelegate(

Type type,

Object firstArgument,

MethodInfo method,

bool throwOnBindFailure

)

public static Delegate CreateDelegate(

Type type,

MethodInfo method,

bool throwOnBindFailure

)

(责任编辑:IT教学网)

更多
上一篇:没有了

相关FTP服务器文章

推荐FTP服务器文章