91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#怎么操作泛型與屬性字段

發布時間:2022-05-05 09:08:44 來源:億速云 閱讀:534 作者:iii 欄目:開發技術

這篇“C#怎么操作泛型與屬性字段”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“C#怎么操作泛型與屬性字段”文章吧。

一、使用方法

  • 查找DLL文件,

  • 通過Reflection反射類庫里的各種方法來操作dll文件

二、步驟

加載DLL文件

Assembly assembly1 = Assembly.Load("SqlServerDB");//方式一:這個DLL文件要在啟動項目下
string filePath = Environment.CurrentDirectory + "";
Assembly assembly2 = Assembly.LoadFile(filePath + @"\SqlServerDB.dll");//方式二:完整路徑
Assembly assembly3 = Assembly.LoadFrom(filePath + @"\SqlServerDB.dll");//方式三:完整路徑
Assembly assembly4 = Assembly.LoadFrom(@"SqlServerDB.dll");//方式三:完整路徑

獲取指定類型

foreach (var item in assembly4.GetTypes())//查找所有的類型,就是有多少個類
{
    Console.WriteLine(item.Name);
}

獲取構造函數

Type type = assembly4.GetType("SqlServerDB.ReflectionTest");//在ReflectionTest類中調用
foreach (var ctor in type.GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public))
{
    Console.WriteLine($"構造方法:{ctor.Name}");
    foreach (var param in ctor.GetParameters())
    {
        Console.WriteLine($"構造方法的參數:{param.ParameterType}");
    }
}
//【3】實例化
//ReflectionTest reflectionTest = new ReflectionTest();//這種實例化是知道具體類型--靜態

//object objTest = Activator.CreateInstance(type);//動態實例化--調用我們的構造方法
object objTest1 = Activator.CreateInstance(type, new object[] { "string" });//動態實例化--調用我們的有參數構造方法

//調用私有構造函數
//ReflectionTest reflectionTest = new ReflectionTest();  //普通調用
object objTest2 = Activator.CreateInstance(type, true);

調用非構造方法

object objTest2 = Activator.CreateInstance(type, true);
//調用普通方法
ReflectionTest reflectionTest = objTest2 as ReflectionTest;//as轉換的好處,它不報錯,類型不對的話就返回null
reflectionTest.Show1();

//調用私有方法
var method = type.GetMethod("Show2", BindingFlags.Instance | BindingFlags.NonPublic);
method.Invoke(objTest2, new object[] { });

調用泛型方法

//泛型無參數
var method3 = type.GetMethod("Show3");//查找指定方法
var genericMethod = method3.MakeGenericMethod(new Type[] { typeof(int) });//指定泛型參數類型T
genericMethod.Invoke(objTest2, new object[] { });

//泛型有參數
var method4 = type.GetMethod("Show4");//查找指定方法
var genericMethod4 = method4.MakeGenericMethod(new Type[] { typeof(string) });//指定泛型參數類型T
genericMethod4.Invoke(objTest2, new object[] { 123, "泛型string參數" });

反射測試類

位于SqlServerDB.dll中的ReflectionTest.cs文件中

    /// <summary>
    /// 反射測試類
    /// </summary>
   public class ReflectionTest
    {
        //私有構造函數
        private ReflectionTest()
        {
            Console.WriteLine("這是私有無參數構造方法");
        }

        //普通構造函數
        //public ReflectionTest()
        //{
        //    Console.WriteLine("這是無參數構造方法");
        //}

        public ReflectionTest(string name)
        {
            Console.WriteLine($"這是有參數構造方法+參數值是:{name}");
        }

        public void Show1()
        {
            Console.WriteLine("調用普通方法", this.GetType());
        }

        private void Show2()
        {
            Console.WriteLine("調用私有方法",this.GetType());
        }


        public void Show3<T>()
        {
            Console.WriteLine("調用無參數泛型方法", this.GetType());
        }

        public void Show4<T>(int id,string name)
        {
            Console.WriteLine($"調用有參數泛型方法,參數是{id},{name}", this.GetType());
        }
    }

操作泛型類和泛型方法

加載DLL文件

Assembly assembly = Assembly.LoadFrom(@"SqlServerDB.dll");

獲取指定類型

Type type = assembly.GetType("SqlServerDB.GenericClass`2").MakeGenericType(typeof(int), typeof(string));//一定給定具體類型參數

調用泛型方法

object objTest2 = Activator.CreateInstance(type);
var method = type.GetMethod("GenericMethod").MakeGenericMethod(typeof(int));
method.Invoke(objTest2, new object[] { });

反射測試類

位于SqlServerDB.dll中的GenericClass.cs文件中

public class GenericClass<T,W>
{
    public void GenericMethod<TType>()
    {
        Console.WriteLine("泛型類調用+泛型方法");
    }
}

操作類屬性字段

加載DLL文件

Assembly assembly2 = Assembly.LoadFrom("SqlServerDB.dll");

獲取指定類型

Type type2 = assembly2.GetType("SqlServerDB.PropertyClass");

調用泛型方法

object obj = Activator.CreateInstance(type2);
foreach (var property in type2.GetProperties())
{
    Console.WriteLine(property.Name);
    //給屬性設置值
    if (property.Name.Equals("Id"))
    {
        property.SetValue(obj, 1);
    }
    else if (property.Name.Equals("Name"))
    {
        property.SetValue(obj, "學習編程");
    }
    else if (property.Name.Equals("Phone"))
    {
        property.SetValue(obj, "123459789");
    }
    //獲取屬性值
    Console.WriteLine(property.GetValue(obj));
}

反射測試類

位于SqlServerDB.dll中的PropertyClass.cs文件中

public class PropertyClass
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Phone { get; set; }
}

以上就是關于“C#怎么操作泛型與屬性字段”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

高平市| 铁岭市| 武强县| 延吉市| 西吉县| 沛县| 嘉善县| 华宁县| 广平县| 浮山县| 昌吉市| 改则县| 蕉岭县| 莲花县| 玉龙| 祁阳县| 辽源市| 牟定县| 五常市| 米脂县| 徐州市| 涪陵区| 新和县| 古田县| 汝城县| 灵台县| 玛沁县| 平顺县| 如皋市| 康平县| 潍坊市| 马山县| 邛崃市| 阳谷县| 江陵县| 渑池县| 原阳县| 侯马市| 健康| 会东县| 鲁山县|