半亩方塘

Welcome!

C#的反射详解(二)
2。动态添加和使用类型

反射提供了由语言编译器(例如 Microsoft Visual Basic .NET 和 JScript)用来实现隐式晚期绑定的基础结构。绑定是查找与唯一指定的类型相对应的声明(即实现)的过程。由于此过程在运行时而不是在编译时发生,所以称作晚期绑定。Visual Basic .NET 允许您在代码中使用隐式的晚期绑定;Visual Basic 编译器将调用一个帮助器方法,该方法使用反射来获取对象类型。传递给帮助器方法的参数有助于在运行时调用正确的方法。这些参数包括:对其调用方法的实例(对象),被调用方法的名称(字符串),以及传递给被调用方法的参数(对象数组)。

 
以下示例是动态调用动态链接库中的GetDataSet方法,该方法需要参数string userID

 

 
 
3. 访问自定义属性
       访问自定义属性和动态添加和使用类型一样.
 /**//// <summary>
        
/// 执行公式的运算
        
/// </summary>
        
/// <param name="value">需要计算的原始值</param>
        
/// <param name="assessment">考核名称</param>
        
/// <returns></returns>

        public float ExeExpression(string assessment, params object[] values)
        
...{

            
string expression = this.GetExpression(assessment);
            
//从当前应用程序加载此dll  
            string path = "";
            
if (System.Environment.CurrentDirectory + @"" == AppDomain.CurrentDomain.BaseDirectory)//Windows应用程序则相等
            ...{
                path 
= AppDomain.CurrentDomain.BaseDirectory;
            }

            
else
            
...{
                path 
= AppDomain.CurrentDomain.BaseDirectory + @"Bin";
            }

            
string dllPath = path + expression + ".dll";
            System.Reflection.Assembly assmble 
= System.Reflection.Assembly.LoadFile(dllPath);

            
string typeFullName = expression + ".ExpressionClass";
            Type tmpType 
= assmble.GetType(typeFullName);
            System.Reflection.MethodInfo tmpMethod 
= tmpType.GetMethod("ExeExpression");
            System.Reflection.PropertyInfo tmpProperty 
= tmpType.GetProperty("ConnectionString");

            
//创建对象,设置属性值,并调用方法
            object tmpobj = assmble.CreateInstance(typeFullName);
            tmpProperty.SetValue(tmpobj, connectionString, 
null);
            
float result = 0;
            result 
= (float)tmpMethod.Invoke(tmpobj, values);
            
return result;

        }
Assembly assembly; 
Type type; 

string dllPath = @"D: estPowerSpace.VCP.Utility.dll"
try 

...
     assembly 
= Assembly.LoadFile(dllPath); 
     type 
= assembly.GetType("PowerSpace.VCP.Utility.cMyString",true,true);//cMyResult 
}
 
catch(FileNotFoundException) 
...

Response.Write(
"Could not load Assembly: ""+ dllPath +"""); 

     Return 
null

}
 
catch(TypeLoadException) 

...

Response.Write(
"Could not load Type: "string"   from assembly: "" + dllPath + """); return null


}
 

MethodInfo method 
= type.GetMethod("TestInvoke"); 

object obj = Assembly.GetAssembly(type).CreateInstance("PowerSpace.VCP.Utility.GetDataSet"); 


object s = method.Invoke(obj,new object[]...{"jiangli"}); 

DataSet ss 
= (DataSet)s; 

assembly 
= null
type 
= null
method 
=null
return ss; 


 

 
 
阅读更多
个人分类: C#
想对作者说点什么? 我来说一句

C# 反射详解

xunzaosiyecao xunzaosiyecao

2016-02-28 10:04:17

阅读数:7225

反射 C# myself

2011年03月23日 565KB 下载

c#反射c#反射c#反射

2010年10月25日 48KB 下载

没有更多推荐了,返回首页

不良信息举报

C#的反射详解(二)

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭