【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;
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;
}
}
好的老师,事半功倍,无门路的学习,事倍功半。
研究了一天,终于弄明白了反射程序集,命名空间,类,方法,参数了假定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调试,挨个检查是否赋予正确的值,确保无空值。
终于理解了反射程序集,命名空间,类,方法,参数,真开心啊,网上找到半天,动则数百行,三五个类才解决的问题,其实就几行解决问题,也没说清楚错误原因,理解起来极为费解,这篇简明扼要,或许能帮到您。
传输属性的秘籍
首先在当前新开类:MyEntitypublic 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]