前言

在C#开发的WinForm窗体程序开发的时候,经常会使用多线程处理一些比较耗时之类的操作。不过会有一个问题:就是涉及到跨线程操作UI元素。

相信才开始接触的人一定会遇上这个问题。

为了解决这个问题,可以通过委托来实现。

我为了后期使用更加方便,就将常用的几个控件(TextBox、Label、CheckBox、RadioButton、ProgressBar)UI操作进行了封装,源码可以在github上查看:GitHub仓库地址

源码在github仓库中的XY.WINUI.ControlEx.InvokeEx文件夹中

使用示例

在测试项目中有使用的方法,这里只做简单介绍。

调用方法在Invokes类中,也可以使用单独的类调用。

例如:在窗体中为tbName的TextBox设置和获取值

//首先,使用命名空间
using XY.WINUI.ControlEx.InvokeEx; //第一种
//设置TextBox的值
Invokes.SetTextBoxText(tbName,"TextBox文本");
//获取TextBox的值
string value = Invokes.GetTextBoxText(tbName); //第二种
//设置TextBox的值
TextBoxInvoke.SetTextBoxText(tbName,"TextBox文本");
//获取TextBox的值
string value = TextBoxInvoke.GetTextBoxText(tbName);

GitHub源码

帮助类源码

集合类(Invokes.cs)

Invokes.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms; namespace XY.WINUI.ControlEx.InvokeEx
{
public class Invokes
{
#region //Controls #region // TextBox
/// <summary>
/// 设置文本框文本
/// </summary>
/// <param name="Ctrl"></param>
/// <param name="Text"></param>
public static void SetTextBoxText(TextBox Ctrl, string Text)
{
TextBoxInvoke.SetTextBoxText(Ctrl, Text);
} /// <summary>
/// 获取文本框文本方法
/// </summary>
/// <param name="Ctrl"></param>
public static string GetTextBoxText(TextBox Ctrl)
{
return TextBoxInvoke.GetTextBoxText(Ctrl); ;
}
#endregion #region // Label
/// <summary>
/// 设置标签文本
/// </summary>
/// <param name="Ctrl"></param>
/// <param name="Text"></param>
public static void SetLabelText(Label Ctrl, string Text)
{
LabelInvoke.SetLabelText(Ctrl, Text);
} /// <summary>
/// 获取标签文本方法
/// </summary>
/// <param name="Ctrl"></param>
public static string GetLabelText(Label Ctrl)
{
return LabelInvoke.GetLabelText(Ctrl); ;
}
#endregion #region // RadioButton
/// <summary>
/// 获取单选按钮选中状态
/// </summary>
/// <param name="Ctrl"></param>
/// <returns></returns>
public static bool GetRadioButtonChecked(RadioButton Ctrl)
{
return RadioButtonInvoke.GetRadioButtonChecked(Ctrl);
} /// <summary>
/// 设置单选按钮选中状态
/// </summary>
/// <param name="Ctrl"></param>
/// <param name="Checked"></param>
public static void SetRadioButtonChecked(RadioButton Ctrl, bool Checked)
{
RadioButtonInvoke.SetRadioButtonChecked(Ctrl, Checked);
}
#endregion #region // CheckBox
/// <summary>
/// 获取选择按钮选中状态
/// </summary>
/// <param name="Ctrl"></param>
/// <returns></returns>
public static bool GetCheckBoxChecked(CheckBox Ctrl)
{
return CheckBoxInvoke.GetCheckBoxChecked(Ctrl);
} /// <summary>
/// 设置选择按钮选中状态
/// </summary>
/// <param name="Ctrl"></param>
/// <param name="Checked"></param>
public static void SetCheckBoxChecked(CheckBox Ctrl, bool Checked)
{
CheckBoxInvoke.SetCheckBoxChecked(Ctrl, Checked);
}
#endregion #region // ProgressBar
/// <summary>
/// 获取进度条值
/// </summary>
/// <param name="Ctrl"></param>
public static int GetProgressBarValue(ProgressBar Ctrl)
{
return ProgressBarInvoke.GetProgressBarValue(Ctrl);
}
/// <summary>
/// 设置进度条值
/// </summary>
/// <param name="Ctrl"></param>
/// <param name="Value"></param>
public static void SetProgressBarValue(ProgressBar Ctrl, int Value)
{
ProgressBarInvoke.SetProgressBarValue(Ctrl, Value);
} /// <summary>
/// 获取进度条最小值
/// </summary>
/// <param name="Ctrl"></param>
public static int GetProgressBarMinValue(ProgressBar Ctrl)
{
return ProgressBarInvoke.GetProgressBarMinValue(Ctrl);
}
/// <summary>
/// 设置进度条最小值
/// </summary>
/// <param name="Ctrl"></param>
/// <param name="Value"></param>
public static void SetProgressBarMinValue(ProgressBar Ctrl, int Value)
{
ProgressBarInvoke.SetProgressBarMinValue(Ctrl, Value);
} /// <summary>
/// 获取进度条最大值
/// </summary>
/// <param name="Ctrl"></param>
public static int GetProgressBarMaxValue(ProgressBar Ctrl)
{
return ProgressBarInvoke.GetProgressBarMaxValue(Ctrl);
}
/// <summary>
/// 设置进度条最大值
/// </summary>
/// <param name="Ctrl"></param>
/// <param name="Value"></param>
public static void SetProgressBarMaxValue(ProgressBar Ctrl, int Value)
{
ProgressBarInvoke.SetProgressBarMaxValue(Ctrl, Value);
}
#endregion #endregion #region // Common #region // Visible
/// <summary>
/// 获取控件是否可见委托
/// </summary>
/// <param name="Ctrl"></param>
private delegate bool GetControlVisibleDelegate(Control Ctrl);
/// <summary>
/// 设置控件是否可见委托
/// </summary>
/// <param name="Ctrl"></param>
/// <param name="Visible"></param>
private delegate void SetControlVisibleDelegate(Control Ctrl, bool Visible); /// <summary>
/// 获取控件是否可见方法
/// </summary>
/// <param name="Ctrl"></param>
private static bool GetControlVisibleFunc(Control Ctrl)
{
return Ctrl.Visible;
} /// <summary>
/// 获取控件是否可见
/// </summary>
/// <param name="flag"></param>
public static bool GetControlVisible(Control Ctrl)
{
return (bool)Ctrl.Invoke(new SetControlVisibleDelegate(SetControlVisibleFunc), new object[] { Ctrl });
} /// <summary>
/// 设置控件是否可见方法
/// </summary>
/// <param name="Ctrl"></param>
/// <param name="Visible"></param>
private static void SetControlVisibleFunc(Control Ctrl, bool Visible)
{
Ctrl.Visible = Visible;
Ctrl.Refresh();
} /// <summary>
/// 设置控件是否可见
/// </summary>
/// <param name="Ctrl"></param>
/// <param name="Visible"></param>
public static void SetControlVisible(Control Ctrl, bool Visible)
{
Ctrl.Invoke(new SetControlVisibleDelegate(SetControlVisibleFunc), new object[] { Ctrl, Visible });
}
#endregion #endregion
}
}

文本框(TextBox)

TextBoxInvoke.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms; namespace XY.WINUI.ControlEx.InvokeEx
{
/// <summary>
/// TextBoxInvoke
/// </summary>
public class TextBoxInvoke
{
/// <summary>
/// 获取文本框文本委托
/// </summary>
/// <param name="Ctrl"></param>
private delegate string GetTextBoxTextDelegate(TextBox Ctrl);
/// <summary>
/// 设置文本框文本委托
/// </summary>
/// <param name="Ctrl"></param>
/// <param name="Text"></param>
private delegate void SetTextBoxTextDelegate(TextBox Ctrl, string Text); /// <summary>
/// 获取文本框文本方法
/// </summary>
/// <param name="Ctrl"></param>
private static string GetTextBoxTextFunc(TextBox Ctrl)
{
return Ctrl.Text;
} /// <summary>
/// 获取文本框文本
/// </summary>
/// <param name="Ctrl"></param>
/// <returns></returns>
public static string GetTextBoxText(TextBox Ctrl)
{
return (string)Ctrl.Invoke(new GetTextBoxTextDelegate(GetTextBoxTextFunc), new object[] { Ctrl });
} /// <summary>
/// 设置文本框文本方法
/// </summary>
/// <param name="Ctrl"></param>
/// <param name="Text"></param>
private static void SetTextBoxTextFunc(TextBox Ctrl, string Text)
{
Ctrl.Text = Text;
Ctrl.Refresh();
} /// <summary>
/// 设置文本框文本
/// </summary>
/// <param name="Ctrl"></param>
/// <param name="Text"></param>
public static void SetTextBoxText(TextBox Ctrl, string Text)
{
Ctrl.Invoke(new SetTextBoxTextDelegate(SetTextBoxTextFunc), new object[] { Ctrl, Text });
}
}
}

标签(Label)

LabelInvoke.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms; namespace XY.WINUI.ControlEx.InvokeEx
{
/// <summary>
/// LabelInvoke
/// </summary>
public class LabelInvoke
{
/// <summary>
/// 获取标签文本委托
/// </summary>
/// <param name="Ctrl"></param>
private delegate string GetLabelTextDelegate(Label Ctrl);
/// <summary>
/// 设置标签文本委托
/// </summary>
/// <param name="Ctrl"></param>
/// <param name="Text"></param>
private delegate void SetLabelTextDelegate(Label Ctrl, string Text); /// <summary>
/// 获取标签文本方法
/// </summary>
/// <param name="Ctrl"></param>
private static string GetLabelTextFunc(Label Ctrl)
{
return Ctrl.Text;
} /// <summary>
/// 获取标签文本
/// </summary>
/// <param name="Ctrl"></param>
/// <returns></returns>
public static string GetLabelText(Label Ctrl)
{
return (string)Ctrl.Invoke(new GetLabelTextDelegate(GetLabelTextFunc), new object[] { Ctrl });
} /// <summary>
/// 设置标签文本方法
/// </summary>
/// <param name="Ctrl"></param>
/// <param name="Text"></param>
private static void SetLabelTextFunc(Label Ctrl, string Text)
{
Ctrl.Text = Text;
Ctrl.Refresh();
} /// <summary>
/// 设置标签文本
/// </summary>
/// <param name="Ctrl"></param>
/// <param name="Text"></param>
public static void SetLabelText(Label Ctrl, string Text)
{
Ctrl.Invoke(new SetLabelTextDelegate(SetLabelTextFunc), new object[] { Ctrl, Text });
}
}
}

复选框(CheckBox)

CheckBoxInvoke.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms; namespace XY.WINUI.ControlEx.InvokeEx
{
/// <summary>
/// CheckBoxInvoke
/// </summary>
public class CheckBoxInvoke
{
/// <summary>
/// 获取选择按钮选中状态委托
/// </summary>
/// <param name="Ctrl"></param>
private delegate bool GetCheckBoxCheckedDelegate(CheckBox Ctrl);
/// <summary>
/// 设置选择按钮选中状态委托
/// </summary>
/// <param name="Ctrl"></param>
/// <param name="Checked"></param>
private delegate void SetCheckBoxCheckedDelegate(CheckBox Ctrl, bool Checked); /// <summary>
/// 获取选择按钮选中状态方法
/// </summary>
/// <param name="Ctrl"></param>
private static bool GetCheckBoxCheckedFunc(CheckBox Ctrl)
{
return Ctrl.Checked;
} /// <summary>
/// 获取选择按钮选中状态
/// </summary>
/// <param name="Ctrl"></param>
/// <returns></returns>
public static bool GetCheckBoxChecked(CheckBox Ctrl)
{
return (bool)Ctrl.Invoke(new GetCheckBoxCheckedDelegate(GetCheckBoxCheckedFunc), new object[] { Ctrl });
} /// <summary>
/// 设置选择按钮选中状态方法
/// </summary>
/// <param name="Ctrl"></param>
/// <param name="Checked"></param>
private static void SetCheckBoxCheckedFunc(CheckBox Ctrl, bool Checked)
{
Ctrl.Checked = Checked;
Ctrl.Refresh();
} /// <summary>
/// 设置选择按钮选中状态
/// </summary>
/// <param name="Ctrl"></param>
/// <param name="Checked"></param>
public static void SetCheckBoxChecked(CheckBox Ctrl, bool Checked)
{
Ctrl.Invoke(new SetCheckBoxCheckedDelegate(SetCheckBoxCheckedFunc), new object[] { Ctrl, Checked });
}
}
}

单选按钮(RadioButton)

RadioButtonInvoke.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms; namespace XY.WINUI.ControlEx.InvokeEx
{
/// <summary>
/// RadioButtonInvoke
/// </summary>
public class RadioButtonInvoke
{
/// <summary>
/// 获取单选按钮选中状态委托
/// </summary>
/// <param name="Ctrl"></param>
private delegate bool GetRadioButtonCheckedDelegate(RadioButton Ctrl);
/// <summary>
/// 设置单选按钮选中状态委托
/// </summary>
/// <param name="Ctrl"></param>
/// <param name="Checked"></param>
private delegate void SetRadioButtonCheckedDelegate(RadioButton Ctrl, bool Checked); /// <summary>
/// 获取单选按钮选中状态方法
/// </summary>
/// <param name="Ctrl"></param>
private static bool GetRadioButtonCheckedFunc(RadioButton Ctrl)
{
return Ctrl.Checked;
} /// <summary>
/// 获取单选按钮选中状态
/// </summary>
/// <param name="Ctrl"></param>
/// <returns></returns>
public static bool GetRadioButtonChecked(RadioButton Ctrl)
{
return (bool)Ctrl.Invoke(new GetRadioButtonCheckedDelegate(GetRadioButtonCheckedFunc), new object[] { Ctrl });
} /// <summary>
/// 设置单选按钮选中状态方法
/// </summary>
/// <param name="Ctrl"></param>
/// <param name="Checked"></param>
private static void SetRadioButtonCheckedFunc(RadioButton Ctrl, bool Checked)
{
Ctrl.Checked = Checked;
Ctrl.Refresh();
} /// <summary>
/// 设置单选按钮选中状态
/// </summary>
/// <param name="Ctrl"></param>
/// <param name="Checked"></param>
public static void SetRadioButtonChecked(RadioButton Ctrl, bool Checked)
{
Ctrl.Invoke(new SetRadioButtonCheckedDelegate(SetRadioButtonCheckedFunc), new object[] { Ctrl, Checked });
}
}
}

进度条(ProgressBar)

ProgressBarInvoke.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms; namespace XY.WINUI.ControlEx.InvokeEx
{
/// <summary>
/// ProgressBarInvoke
/// </summary>
public class ProgressBarInvoke
{
/// <summary>
/// 获取进度条当前值委托
/// </summary>
/// <param name="Ctrl"></param>
private delegate int GetProgressBarValueDelegate(ProgressBar Ctrl);
/// <summary>
/// 设置进度条当前值委托
/// </summary>
/// <param name="Ctrl"></param>
/// <param name="Value"></param>
private delegate void SetProgressBarValueDelegate(ProgressBar Ctrl, int Value); /// <summary>
/// 获取进度条最小值委托
/// </summary>
/// <param name="Ctrl"></param>
private delegate int GetProgressBarMinValueDelegate(ProgressBar Ctrl);
/// <summary>
/// 设置进度条最小值委托
/// </summary>
/// <param name="Ctrl"></param>
/// <param name="Value"></param>
private delegate void SetProgressBarMinValueDelegate(ProgressBar Ctrl, int Value); /// <summary>
/// 获取进度条最大值委托
/// </summary>
/// <param name="Ctrl"></param>
private delegate int GetProgressBarMaxValueDelegate(ProgressBar Ctrl);
/// <summary>
/// 设置进度条最大值委托
/// </summary>
/// <param name="Ctrl"></param>
/// <param name="Value"></param>
private delegate void SetProgressBarMaxValueDelegate(ProgressBar Ctrl, int Value); /// <summary>
/// 获取进度条当前值方法
/// </summary>
/// <param name="Ctrl"></param>
private static int GetProgressBarValueFunc(ProgressBar Ctrl)
{
return Ctrl.Value;
} /// <summary>
/// 获取进度条当前值
/// </summary>
/// <param name="Ctrl"></param>
/// <returns></returns>
public static int GetProgressBarValue(ProgressBar Ctrl)
{
return (int)Ctrl.Invoke(new GetProgressBarValueDelegate(GetProgressBarValueFunc), new object[] { Ctrl });
} /// <summary>
/// 设置进度条当前值方法
/// </summary>
/// <param name="Ctrl"></param>
/// <param name="Value"></param>
private static void SetProgressBarValueFunc(ProgressBar Ctrl, int Value)
{
Ctrl.Value = Value;
Ctrl.Refresh();
} /// <summary>
/// 设置进度条当前值
/// </summary>
/// <param name="Ctrl"></param>
/// <param name="Value"></param>
public static void SetProgressBarValue(ProgressBar Ctrl, int Value)
{
Ctrl.Invoke(new SetProgressBarValueDelegate(SetProgressBarValueFunc), new object[] { Ctrl, Value });
} /// <summary>
/// 获取进度条最小值方法
/// </summary>
/// <param name="Ctrl"></param>
private static int GetProgressBarMinValueFunc(ProgressBar Ctrl)
{
return Ctrl.Minimum;
} /// <summary>
/// 获取进度条最小值
/// </summary>
/// <param name="Ctrl"></param>
/// <returns></returns>
public static int GetProgressBarMinValue(ProgressBar Ctrl)
{
return (int)Ctrl.Invoke(new GetProgressBarValueDelegate(GetProgressBarMinValueFunc), new object[] { Ctrl });
} /// <summary>
/// 设置进度条最小值方法
/// </summary>
/// <param name="Ctrl"></param>
/// <param name="Value"></param>
private static void SetProgressBarMinValueFunc(ProgressBar Ctrl, int Value)
{
Ctrl.Minimum = Value;
Ctrl.Refresh();
} /// <summary>
/// 设置进度条最小值
/// </summary>
/// <param name="Ctrl"></param>
/// <param name="Value"></param>
public static void SetProgressBarMinValue(ProgressBar Ctrl, int Value)
{
Ctrl.Invoke(new SetProgressBarValueDelegate(SetProgressBarMinValueFunc), new object[] { Ctrl, Value });
} /// <summary>
/// 获取进度条最大值方法
/// </summary>
/// <param name="Ctrl"></param>
private static int GetProgressBarMaxValueFunc(ProgressBar Ctrl)
{
return Ctrl.Maximum;
} /// <summary>
/// 获取进度条最大值
/// </summary>
/// <param name="Ctrl"></param>
/// <returns></returns>
public static int GetProgressBarMaxValue(ProgressBar Ctrl)
{
return (int)Ctrl.Invoke(new GetProgressBarValueDelegate(GetProgressBarMaxValueFunc), new object[] { Ctrl });
} /// <summary>
/// 设置进度条最大值方法
/// </summary>
/// <param name="Ctrl"></param>
/// <param name="Value"></param>
private static void SetProgressBarMaxValueFunc(ProgressBar Ctrl, int Value)
{
Ctrl.Maximum = Value;
Ctrl.Refresh();
} /// <summary>
/// 设置进度条最大值
/// </summary>
/// <param name="Ctrl"></param>
/// <param name="Value"></param>
public static void SetProgressBarMaxValue(ProgressBar Ctrl, int Value)
{
Ctrl.Invoke(new SetProgressBarValueDelegate(SetProgressBarMaxValueFunc), new object[] { Ctrl, Value });
}
}
}

GitHub源码

由于时间关系,暂时就封装了这么多。

会持续更新……

欢迎大家补充。

WinForm跨线程UI操作常用控件类大全

[WinForm]WinForm跨线程UI操作常用控件类大全的更多相关文章

  1. c#中如何跨线程调用windows窗体控件

    c#中如何跨线程调用windows窗体控件?   我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍.首 ...

  2. 如何跨线程调用Windows窗体控件

    通过一个子线程来操作主线程中的控件,但是,这样作会出现一个问题(如图1所示),就是TextBox控件是在主线程中创建的,在子线程中并没有对其进行创建,也就是从不是创建控件的线程访问它.那么,如何解决跨 ...

  3. c#中如何跨线程调用windows窗体控件?

    我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍.首先来看传统方法: public partial c ...

  4. iOS开发-UI (一)常用控件

    从这里开始是UI篇 知识点: 1.常用IOS基本控件 2.UITouch ======================= 常用基本控件 1.UISegmentedControl:分段控制器 1)创建方 ...

  5. Android开发UI之常用控件的使用

    1.日期选择控件 DatePickerDialog 代码: btnChooseDate=(Button) findViewById(R.id.btnChooseDate); btnChooseDate ...

  6. 理解SynchronizationContext,如何在Winform里面跨线程访问UI控件

    SynchronizationContext 类是一个基类,可提供不带同步的自由线程上下文. 此类实现的同步模型的目的是使公共语言运行库内部的异步/同步操作能够针对不同的异步模型采取正确的行为.此模型 ...

  7. Winform之跨线程更新UI

    Winform之跨线程更新UI 使用`Invoke`或者`BeginInvoke`与UI线程交互示例 参考及源码 使用Invoke或者BeginInvoke与UI线程交互示例 private void ...

  8. 扩展BindingList,防止增加、删除项时自动更新界面而不出现“跨线程操作界面控件 corss thread operation”异常

    在做界面程序时,常常需要一些数据类,界面元素通过绑定等方式显示出数据,然而由于UI线程不是线程安全的,一般都需要通过Invoke等方式来调用界面控件.但对于数据绑定bindingList而言,没法响应 ...

  9. Winform 让跨线程访问变得更简单

    Winform 让跨线程访问变得更简单 前言 由于多线程可能导致对控件访问的不一致,导致出现问题.C#中默认是要线程安全的,即在访问控件时需要首先判断是否跨线程,如果是跨线程的直接访问,在运行时会抛出 ...

随机推荐

  1. 23种设计模式--建造者模式-Builder Pattern

    一.建造模式的介绍       建造者模式就是将零件组装成一个整体,用官方一点的话来讲就是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.生活中比如说组装电脑,汽车等等这些都是建 ...

  2. LeetCode 7. Reverse Integer

    Reverse digits of an integer. Example1: x = 123, return 321 Example2: x = -123, return -321 Have you ...

  3. Smarty的基本使用与总结

    含义: Smarty是PHP的一个引擎模板,可以更好的进行逻辑与显示的分离,即我们常说的MVC,这个引擎的作用就是将C分离出来. 环境需求:PHP5.2或者更高版本 我使用的环境是:PHP5.3,wi ...

  4. 【JQ基础】DOM操作

    内部插入:append() //向每个匹配的元素内部追加内容,可包含 HTML 标签 $(selector).append(function(index,html)) /*•index - 可选.接收 ...

  5. 【干货分享】流程DEMO-固定资产转移流程

    流程名: 固定资产转移  业务描述: 固定资产从某员工转移至另一员工,转出人与转入人必须不同  流程相关文件: 流程包.xml  流程说明: 直接导入流程包文件,即可使用本流程  表单:  流程:  ...

  6. Android Studio开发RecyclerView遇到的各种问题以及解决(二)

    开发RecyclerView时候需要导入别人的例子,我的是从github导入的,下载下github的压缩包之后解压看你要导入的文件是priject还是Module.(一般有app文件夹的大部分是pro ...

  7. Android—关于自定义对话框的工具类

    开发中有很多地方会用到自定义对话框,为了避免不必要的城府代码,在此总结出一个工具类. 弹出对话框的地方很多,但是都大同小异,不同无非就是提示内容或者图片不同,下面这个类是将提示内容和图片放到了自定义函 ...

  8. ORACLE从共享池删除指定SQL的执行计划

    Oracle 11g在DBMS_SHARED_POOL包中引入了一个名为PURGE的新存储过程,用于从对象库缓存中刷新特定对象,例如游标,包,序列,触发器等.也就是说可以删除.清理特定SQL的执行计划 ...

  9. 从贝叶斯到粒子滤波——Round 1

    粒子滤波确实是一个挺复杂的东西,从接触粒子滤波到现在半个多月,博主哦勒哇看了N多篇文章,查略了嗨多资料,很多内容都是看了又看,细细斟酌.今日,便在这里验证一下自己的修炼成果,请各位英雄好汉多多指教. ...

  10. .NET面试题系列[6] - 反射

    反射 - 定义,实例与优化 在面试中,通常会考察反射的定义(操作元数据),可以用反射做什么(获得程序集及其各个部件),反射有什么使用场景(ORM,序列化,反序列化,值类型比较等).如果答得好,还可能会 ...