admin 发表于 2020-11-25 16:22:25

【C#】程序集/空间名/类/属性/方法/参数参考

//根据程序集的名字加载程序集,它会在本地目录和全局程序缓存目录中查找符合名字的程序集
Assembly assembly1 = Assembly.Load("Hondy.Site");

//这里的参数是程序集的完整的路径名,它不会再其他的位置搜索
Assembly assembly2 = Assembly.LoadFrom(@"c:\xx\xx\xx\Hondy.Site.dll");

MyClass my = new MyClass();//建立一个类,以便获取该类的程序集
Assembly assem = my.GetType().Assembly; //通过类的type对象获取它所在的程序集 Assembly
Console.WriteLine(assem.FullName);      //获取一个程序集的完整的名称
Type[] types = assem.GetTypes();      //当前程序集下所有的类名foreach(var type in types)
    Response.Write(type);


//获取一个已知的程序集命名空间
Assembly a = Assembly.Load("Hondy.Site");
Type[] types2 = a.GetTypes();
foreach (Type t in types2)
{
    Response.Write(t.FullName+"<br>");
}

//设置获取属性值
ObjectHandle handle = Activator.CreateInstance("uzhan5", "uzhan5.userinfo");
Object p = handle.Unwrap();
Type t = p.GetType();
t.GetProperty("username").SetValue(p, "aaa");//给属性赋值
t.GetProperty("username").GetValue(p);//获取属性值
returnp;




admin 发表于 2020-11-25 16:41:42

1、获取C#类中类名
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name;

2、获取C#类中类名(包含命名空间)
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName;

3、获取C# 类中方法名,如果有返回值,类+返回值
System.Reflection.MethodBase.GetCurrentMethod().Name;
举例:
private void(string) Weixin()
      {
            string name=MethodBase.GetCurrentMethod().DeclaringType.Name; //返回Test(当前类名)
            string name1=MethodBase.GetCurrentMethod().DeclaringType.FullName;//返回Hondy.Site.Test(包括命名空间+类名)
            string name2=MethodBase.GetCurrentMethod().Name;
            Response.Write(name + "-" + name1 + "-" + name2);
            return xoods("a"); //当Weixin为void不需要返回值:Weixin
                                       //当Weixin需要返回string类型时,返回Winxingooda,注意不是Winxinxoodsa
            return "xoodsa"    //当Weixin不调用外部函数时,直接返回Winxinxoodsa
      }
      private string xoods(string a)
      {
            return "good" + a;
      }

}

admin 发表于 2020-11-25 22:35:25

好的老师,事半功倍,无门路的学习,事倍功半。

研究了一天,终于弄明白了反射程序集,命名空间,类,方法,参数了假定request传入
a:程序集
s:命名空间
c:类
m:方法
p:参数

//Hondy.Site
string assemblyname = Request.Form["a"];
//Hondy.Site.Login
string nameSpace = Request.Form["s"];
//Hondy.Site.Login.Weixin
string className = Request.Form["c"];
//Media()
string methodName = Request.Form["m"];

//无或很多很多参数
//Media(params)
string params=methodName = Request.Form["p"];

程序集
//不重要,不用写
//Assembly a = Assembly.Load(assemblyname);

以下都很重要:
命名空间+类:
var tt = Type.GetType(nameSpace+"."+className);
//获取tt类为Hondy.Site.Login.Weixin,也可以是没有命名空间的简写:Weixin类
object obj = Activator.CreateInstance(tt);
//上面这一句话相当于实名的Weixin obj=new Weixin()
方法:
//微信类方法一:定位素材Media
MethodInfo method = tt.GetMethod("Media");

参数:
//如何转换,要考虑各种情况,比json传输data的情况,略过
Object[] paras = new Object[] { params };
这里假定为:Object[] paras = new Object[] { "中国人" };
或者:Object[] paras = new Object[] { "中国人","真牛" };
依此:您高兴怎么写多参数,当然也可以是0参数
Object[] paras = new Object[] {};
//以下相当于执行相应参数的Media方法

//这一句话相当于实例化的:string method=obj.Media,假定Media方法输出为字符串string,当然可以是任意类型,这是由开发者决定的。
string x = (string)method.Invoke(obj,paras);
paras为空时,除了可以用Object[] paras = new Object[] {};
也可以用null,如string x = (string)method.Invoke(obj,null);

经常会错误的原因,主要有:
1、tt类错误导至null,无值错误
2、Media为private,当然就无法调用了,一定要保证类方法为public。
3、命名空间类的路径一定要正确。

检查错误办法,用VS调试,挨个检查是否赋予正确的值,确保无空值。

终于理解了反射程序集,命名空间,类,方法,参数,真开心啊,网上找到半天,动则数百行,三五个类才解决的问题,其实就几行解决问题,也没说清楚错误原因,理解起来极为费解,这篇简明扼要,或许能帮到您。

admin 发表于 2020-11-26 08:22:36

传输属性的秘籍

首先在当前新开类:MyEntity
public class MyEntity {
    public string lng { get; set; }
    public byte ajax { get; set; }
    public string RootPath { get; set; }
    public OleDbConnection con { get; set; }
}


待传递的类,假定为:Weixin(){}
该类一定要继承:MyEntity
继承后,去除Weixin(){}里的属性lng,ajax,rootpath,con,因为EyEntity已经包含了,不必再加避免出错。

再修改:object obj = Activator.CreateInstance(tt);
object改成实例类例,因为object不确定但都继承了MyEntity,所以类名就明确了
MyEntity obj = (MyEntity)Activator.CreateInstance(type);
//设置相应类属性
obj.ajax = ajax;
obj.con = con;
obj.lng = lng;
obj.RootPath = RootPath;

其它保持不变,就等于向Weixin等不确定类传递属性值了,经测试有效。
文中原始代码:Hondy.Site.Login.Default/Hondy.Site.Login.Core.Weixin/.......

页: [1]
查看完整版本: 【C#】程序集/空间名/类/属性/方法/参数参考