dotnet-sdk-2.2.401-win-x64.exe
dotnet-sdk-2.2.401-win-x64.exe
aspnetcore-runtime-2.2.6-win-x64.exe
aspnetcore-runtime-2.2.6-win-x64.exe
webfrom-后台输出提示信息-Pub_Function.Message_Box.Show(thi.pdf
Pub_Function.Message_Box.Show(this.Page, ex.Message);
this.ClientScript.RegisterStartupScript(this.GetType(), "", "[removed]alert('Save Success!');[removed]='../ShipManage/InvChkTime_Set.aspx';[removed]");
DataTable 手动创建数据源 newdtb.pdf
private void Bind_List2()
{
DataTable newdtb = new DataTable();
newdtb.Columns.Add("Id", typeof(int));
newdtb.Columns.Add("trade", typeof(string));
newdtb.Columns.Add("week", typeof(string));
newdtb.Columns.Add("ampm", typeof(string));
newdtb.Columns.Add("check_date", typeof(string));
newdtb.Columns.Add("update_user", typeof(string));
newdtb.Columns.Add("update_date", typeof(string));
newdtb.Columns["Id"].AutoIncrement = true;
for (int i = 1; i < 3; i++)
{
DataTable.Select.pdf
private void Sync_Split_Sub()
{
DataView dv_split = (DataView)Session["dv_split"];
dv_split.Sort = "item";
DataView dv_split_temp_sort = (DataView)Session["dv_split"];
dv_split_temp_sort.Sort = "item";
DataTable dt = dv_split.ToTable();
foreach (DataGridItem item in this.DataGrid_Split.Items)
{
Label lb_item_s=(Label)item.FindControl("lb_item_s");
dv_split_temp_sort.RowFilter = "item like '%" + lb_item_s.Text + "%' ";
C# CheckBox 后台获取要删除的id值.pdf
protected void btnDel_Click(object sender, System.EventArgs e)
{
ArrayList list = new ArrayList();
CheckBox chk;
foreach(DataGridItem it in DataGrid1.Items)
{
chk = (CheckBox)it.Cells[0].Controls[1];
if(chk.Checked)
list.Add(it.Cells[1].Text);
}
C# GridView 后台设置列的可见性.pdf
private void HideColoum()
{
if (this.ddl_DataType.SelectedValue == "CKD" && this.ddl_country.SelectedValue == "Brazil")
{
// type country family PN code PN描述 Manufacturer Address Country of Origin 导入时间 导入人 更新时间 更新人
this.MyView2.Columns[4].Visible = false;
// this.MyView2.Columns[5].Visible = false;
this.MyView2.Columns[11].Visible = false;
this.MyView2.Columns[12].Visible = false;
this.MyView2.Columns[13].Visible = false;
}
if (this.ddl_DataType.SelectedValue == "SKD" && this.ddl_country.SelectedValue == "Brazil")
{
// type country customer CU Ref PN code PN描述 Manufacturer Address Country of Origin DAP unit price 导入时间 导入人 更新时间 更新人
// this.MyView2.Columns[3].Visible = false;
this.MyView2.Columns[12].Visible = false;
this.MyView2.Columns[13].Visible = false;
}
if (this.ddl_DataType.SelectedValue == "SKD" && this.ddl_country.SelectedValue == "Argentina")
{
// type country customer CU Ref PN code PN描述 Country of Origin FOB Price CIP Price 导入时间 导入人 更新时间 更新人
// this.MyView2.Columns[3].Visible = false;
this.MyView2.Columns[8].Visible = false;
this.MyView2.Columns[9].Visible = false;
this.MyView2.Columns[10].Visible = false;
this.MyView2.Columns[11].Visible = false;
}
}
C# dt拼接成html的table以及有合计.pdf
StringBuilder Content = new StringBuilder();
Content.Append("Dear Financial Team,");
Content.Append("<br><br>");
Content.Append("Pls release SO as soon as possible. Any blocking point please highlight timely. Thanks");
TCL.Common.DB_export dbExprot = new TCL.Common.DB_export();
string getMainContent = dbExprot.GetDataTableToHtml(dt);
Content.Append(getMainContent);
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html>
<html
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<table cellspacing="0" width='100%' bordercolordark="white" cellpadding="0" align="center" bordercolorlight="#cccccc" border="1">
C# 列表的下拉框联动.pdf
<asp:TemplateColumn HeaderText="Plant" HeaderStyle-HorizontalAlign="center">
<ItemStyle CssClass="dxgv"></ItemStyle>
<ItemTemplate>
<asp:Label ID="lb_week_p" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.PLANTKEY") %>'> </asp:Label>
</ItemTemplate>
<FooterTemplate>
<font face="宋体"></font>
<asp:DropDownList ID="ddl_week_p" runat="server" Width="100px" AutoPostBack="true">
<asp:ListItem Selected="True" Value="">----</asp:ListItem>
</asp:DropDownList>
</FooterTemplate>
<EditItemTemplate>
<asp:DropDownList ID="ddl_e_week_p" ToolTip='<%# DataBinder.Eval(Container, "DataItem.PLANTKey") %>' OnSelectedIndexChanged="ddl_e_week_p_SelectedIndexChanged" AutoPostBack="true"runat="server" Width="100px">
</asp:DropDownList>
<asp:Label ID="lb_week_p_edit" Visible="false" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.PLANTKEY") %>'></asp:Label>
</EditItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="Storage Location" HeaderStyle-HorizontalAlign="center">
<ItemStyle CssClass="dxgv"></ItemStyle>
<ItemTemplate>
<asp:Label ID="lb_week_s" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.STORAGE_LOCATIONKEY") %>'> </asp:Label>
</ItemTemplate>
<FooterTemplate>
<font face="宋体"></font>
<asp:DropDownList ID="ddl_week_s" runat="server" Width="90px">
<asp:ListItem Selected="True" Value="">----</asp:ListItem>
</asp:DropDownList>
</FooterTemplate>
<EditItemTemplate>
<asp:DropDownList ID="ddl_e_week_s" ToolTip='<%# DataBinder.Eval(Container, "DataItem.STORAGE_LOCATIONKey") %>' runat="server" Width="90px">
</asp:DropDownList>
<asp:Label ID="lb_week_s_edit" Visible="false" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.STORAGE_LOCATIONKEY") %>'></asp:Label>
</EditItemTemplate>
</asp:TemplateColumn>
protected void ddl_week_p_SelectedIndexChanged(object sender, EventArgs e)
{
DropDownList item = (DropDownList)((Control)sender).Parent.Parent.FindControl("ddl_week_s");
item.DataTextField = "txt";
DataTable 导出excel 更新列名或者删除部分列.pdf
DataView dataList = saBatteryHelper.GetSaBatteryList(condition, "PAGE", Int32.Parse(string.IsNullOrEmpty(Imagebutton2.ToolTip) ? "0" : Imagebutton2.ToolTip), this.dg_detail.PageSize, ref total_page, ref total_rec);
if (dataList.Table.Columns.Contains("ROW_ID"))
dataList.Table.Columns.Remove("ROW_ID");
if (dataList.Table.Columns.Contains("LAST_UPDATED_BY"))
dataList.Table.Columns.Remove("LAST_UPDATED_BY");
if (dataList.Table.Columns.Contains("LAST_UPDATE_DATE"))
dataList.Table.Columns.Remove("LAST_UPDATE_DATE");
if (dataList.Table.Columns.Contains("CREATED_BY"))
dataList.Table.Columns.Remove("CREATED_BY");
if (dataList.Table.Columns.Contains("RELATIONSHIPID"))
dataList.Table.Columns["RELATIONSHIPID"].ColumnName = "SA";
C# GridView 后台跨行跨列.pdf
private void GroupColNEW(GridView gridView, int cols)
{
if (gridView.Rows.Count < 1 || cols > gridView.Rows[0].Cells.Count - 1)
{
return;
}
TableCell oldTc = gridView.Rows[0].Cells[cols]; //SO LINE
TableCell oldTc12 = gridView.Rows[0].Cells[13]; //No Cust PO
TableCell oldTc17 = gridView.Rows[0].Cells[18]; //
//TableCell oldTc73 = gridView.Rows[0].Cells[72];
C# id in.pdf
private bool FindSelectedTable(ref System.Data.DataTable table)
{
List<string> ids = new List<string>();
for (int i = 0; i < this.myDataGrid_d.Items.Count; i++)
{
if (((CheckBox)myDataGrid_d.Items[i].FindControl("cb_choice")).Checked)
{
DataGridItem item = myDataGrid_d.Items[i];
ids.Add((item.FindControl("lb_id") as Label).Text);
}
}
if (ids.Count == 0)
{
ShowMessage("请选择数据行!");
return false;
}
string idsString = string.Join(",", ids.ToArray());
table.DefaultView.RowFilter = "ID in (" + idsString + ")";
table = table.DefaultView.ToTable();
return true;
}
webfrom- ListBox 控件的使用.pdf
webfrom- ListBox 控件的使用.pdf
C# EmptyDataTemplate 列表默认展示表头.pdf
<EmptyDataTemplate>
<table cellspacing="0" cellpadding="0" border="1"
<tr class="gridhead_sale">
<th scope="col"
<th scope="col"
<th scope="col"
<th scope="col"
<th scope="col"
<th scope="col"
<th scope="col"
</tr>
</table>
</EmptyDataTemplate>
<td class="td_button" 38px" valign="middle" align="left" colspan="2">
<asp:GridView ID="GridView1" runat="server" GridLines="Vertical" BorderColor="white" Width="100%" AllowSorting="true" AutoGenerateColumns="false" AllowPaging="True">
<SelectedRowStyle CssClass="gridselected" />
<EditRowStyle CssClass="gridedit" />
<AlternatingRowStyle CssClass="alteritem_sale" />
webfrom-前台加载后台方法 --# --.pdf
<asp:TemplateField HeaderText="中港交仓POD">
<ItemTemplate>
<asp:ImageButton ID="imgPod" runat="server" ImageUrl="~/Images/goback.gif" ToolTip="下载"
Visible='<%# IsPod(DataBinder.Eval(Container, "DataItem.ISHKPOD")) %>' />
</ItemTemplate>
</asp:TemplateField>
/// <summary>
/// 文件回形针
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public bool IsPod(object value)
{
if (Convert.ToString(value) == "Y")
{
return true;
}
else
{
return false;
}
}
protected void MyDataGrid_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
DataTable 数据源加载之后列表加载之前重新处理数据.pdf
private DataTable Optimization_DataTable(DataView dv)
{
DataTable dt = dv.Table.Clone();
if (dv.Table.Rows.Count >= 1)
{
for (int i = 0; i < dv.Table.Rows.Count; i++)
{
DataRow dr_1 = dt.NewRow();
string[] str_To_end_customer = dv.Table.Rows[i]["To_end_customer"].ToString().Split(',');
string[] str_HK10_FR10 = dv.Table.Rows[i]["hk_invoice"].ToString().Split(',');
dr_1["status"] = dv.Table.Rows[i]["status"];
dr_1["country"] = dv.Table.Rows[i]["country"];
//dr_1["qty"] = dv.Table.Rows[i]["qty"];
DataTable 重新设置表格列的顺序以及列的名称.pdf
dt.Columns["create_by"].SetOrdinal(0);
dt.Columns["create_by"].ColumnName = "OP";
dt.Columns["hk_invoice"].SetOrdinal(1);
dt.Columns["hk_invoice"].ColumnName = "HK10->FR10";
dt.Columns["To_end_customer"].SetOrdinal(2);
webfrom-逗号分隔然后删除最后一个逗号.pdf
CheckBox chk;
string strArray = "";
string itemList = "";
int num = 0;
foreach (DataGridItem it in MyDataGrid.Items)
{
chk = (CheckBox)it.Cells[0].Controls[1];
if (chk.Checked)
{
strArray += it.Cells[1].Text + ";";
itemList += it.Cells[9].Text + ",";
num++;
}
}
if (num == 0)
{
lblMsg.Text = "请选择合并记录";
return;
}
itemList += ")";
itemList = itemList.Replace(",)",string.Empty);
webfrom-切换单选框和复选框.pdf
private void Datagrid1_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
if (this.rb_type.SelectedIndex == 0)//批量录入
{
e.Item.Cells[2].Visible = false;
}
else
e.Item.Cells[1].Visible = false;
}
<asp:BoundColumn Visible="False" DataField="line_id"></asp:BoundColumn>
<asp:TemplateColumn HeaderText="选择">
<ItemTemplate>
<input id="rb_line" type="radio" value='<%# DataBinder.Eval(Container.DataItem, "line_id") %>'
name="RadioName">
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="选择">
<ItemTemplate>
<asp:CheckBox ID="id" runat="server"></asp:CheckBox>
</ItemTemplate>
</asp:TemplateColumn>
webfrom-父页面调用子页面的方面,刷新列表.pdf
Response.Write("[removed]alert('更新成功!')[removed]");
Response.Write("[removed]window.close();[removed]");
Response.Write("[removed] window.opener.getInfo();[removed]");
function getInfo() {
document.getElementById("TclButton1").click();
}
webfrom- 遍历html生成table.pdf
<table border="1" cellpadding="0" cellspacing="0" width="80%">
<tr>
<td class="category" align="center">
序号
</td>
<td class="category" align="center">
业务类型
</td>
<td class="category" align="center">
业务编码
</td>
<td class="category" align="center">
满板数量
</td>
<td class="category" align="center">
主料编码
</td>
<td class="category" align="center">
维护人员
</td>
<td class="category" align="center">
维护时间
</td>
<td class="category" align="center">
编辑
</td>
</tr>
<%
for (int i = 0; i < _dt.Rows.Count; i++)
{
%>
<tr>
<td align="center">
<%=i+1%>
</td>
<td>
<%=_dt.Rows[i]["TYPE_NAME"].ToString()%>
</td>
<td>
<%=_dt.Rows[i]["TYPE_CODE"].ToString()%>
</td>
<td align="center">
<%=_dt.Rows[i]["BOX_MAX_AMOUNT"].ToString()%>
</td>
<td>
<%=_dt.Rows[i]["PO_NO"].ToString()%>
</td>
<td>
<%=_dt.Rows[i]["LAST_UPDATED_BY"].ToString()%>
</td>
<td>
<%=_dt.Rows[i]["LAST_UPDATE_DATE"].ToString()%>
</td>
<td align="center">
<a Blue"
</td>
</tr>
<%
}%>
</table>
webfrom-列表文本内容自动换行 word-break-keep-all;word-wrap-n.pdf
<asp:TemplateColumn HeaderText="OP CREATE USER" HeaderStyle-HorizontalAlign="center">
<HeaderStyle HorizontalAlign="Center"></HeaderStyle>
<ItemStyle CssClass="dxgv"></ItemStyle>
<ItemTemplate> <div "><asp:Label ID="lb_op_create_user" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.op_create_user") %>'> </asp:Label></div> </ItemTemplate> </asp:TemplateColumn>
myDataGrid_d.Attributes.Add("style", "word-break:keep-all;word-wrap:normal");
00:asp-DataGrid 表头跨行跨列.pdf
tcl[0].Text="车间</th><th rowspan=3>批量<th colspan=16 scope=col valign=middle>当班生产状况</th><th colspan=11 scope=col valign=middle>状态机</th><th scope=col valign=middle rowspan=3>待投数</th><th scope=col valign=middle rowspan=3>明细</th></tr><tr class=tttable bgColor=#FFFFC0><td align=center colspan=4 valign=middle>"+
"投入数</td><td colspan=4 align=center valign=middle>完成机头数</td><td colspan=4 align=center valign=middle>包装数</td><td colspan=4 align=center valign=middle>入库数</td><td rowspan=2>待入库</td><td rowspan=2>待包装</td><td rowspan=2>成品待处理</td><td rowspan=2>待测试</td><td rowspan=2>待修理</td><td rowspan=2>外借</td><td rowspan=2>在老化</td><td rowspan=2>待老化</td><td rowspan=2>老化后待复测</td><td rowspan=2>机头待处理</td><td rowspan=2>待下载</td>"+
"</tr><tr class=tttable bgColor=#FFFFC0><td align=center>当日</td><td align=center>上次</td><td align=center>累计</td><td align=center>汇总</td><td align=center>当日</td><td align=center>上次</td><td align=center>累计</td><td align=center>汇总</td><td align=center>当日</td><td align=center>上次</td><td align=center>累计</td><td align=center>汇总</td><td align=center>当日</td><td align=center>上次</td><td align=center>累计</td><td align=center>汇总</td></tr>";
webfrom:BoundField.pdf
GridView 只需要展示则BoundField ItemTemplate则可以在行里面展示任何控件
<asp:BoundField DataField="mainclass_code" HeaderText="大类编号" />
<asp:TemplateField HeaderText="小类名">
<ItemTemplate>
<asp:TextBox ID="icode" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "subclass_name") %>' />
</ItemTemplate>
</asp:TemplateField>
面试要回答的委托.pdf
一、 委托
设想,如果我们写了一个厨师做菜方法用来做菜,里面有 拿菜、切菜、配菜、炒菜 四个环节,但编写此方法代码的人想让 配菜 这个环节让调用方法的人实现,换句话说,就是想在方法被调用时接收 代码 作为参数,在方法中执行这段传进来的代码。
但,怎么为一个方法传 代码 进来呢?当然大家想到了传递接口方式来实现,咱先不讨论接口,因为微软为我们提供了一个叫做 【委托】 的类型。
(一)、委托基础:
1. 先看看代码:
(1).定一个方法:void SayHi(string name){Console.WriteLine(“Hi~”+name+”! ” );}
(2).声明一种委托类型:delegate void DGSayHi(string uName);
(3).创建委托类型对象:DGSayHi dgObj = new DGSayHi(SayHi);//构造函数中传入了方法
(4).执行委托:
dgObj(“JamesZou”); //调用委托(奇怪:对象加括号 的方式调用?后面解释。)
输出:Hi~JamesZou!
2. 什么是委托?
(1)概念:“C# 中的委托类似于 C 或 C++ 中的函数指针。使用委托使程序员可以将方法引用封装在委托对象内。然后调用该委托对象就可以执行委托对象内方法引用指向的方法,而不必在编译时知道将调用哪个方法(如参数为委托类型的方法,也就是提供了为程序回调指定方法的机制)。”-- 引自MSDN
01: 委托 事件 入门.pdf
C.委托语法糖
(1).注意到上面有3个地方我们都觉得“奇怪”:
a.调用委托对象dgObj(“JamesZou”);
b.向委托注册方法 dgObj+=DaZhaoHu;
c.将方法作为参数 DoTestDelegateFun(SayHi);
这些用法其实都是FW为我们提供的简便语法(它们有个可爱的名字:语法糖),在编译时由编译器转成完整的代码:
a. dgObj.Invoke(“JamesZou”);
b. dgObj = (DGSayHi) Delegate.Combine(dgObj, new DGSayHi(this.DaZhaoHu));
//Combine方法将第二个参数,添加到dgObj中,并返回委托对象。
c. this.DoTestDelegateFun(new DGSayHi(this.SayHi));
Delegate类、Invoke方法、Combine方法是哪来的呢?
(二)、委托原理
1.delegate 关键字
(1).概念:delegate 关键字用于声明一个引用类型,该引用类型可用于封装命名方法或匿名方法。
(2)编译后生成的的中间代码。
请大家思考一下,关键字是类型吗?不是。那编译器遇到这个关键字做了什么事情?借助【IL反汇编程序】 我们来看一看:
a.开始-程序-如图:
带返回值的委托,只可以接受到第二个.pdf
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
DGReturn dgreturn = sayhi;
dgreturn += sayhhhhhi;
string str= dgreturn("return");
//当两个返回值的调用就会只接收到第二个
//lklklklk
MessageBox.Show(str);
}
string sayhi(string str)
{
return "skskks" + str;
}
string sayhhhhhi(string str)
{
return "lklklklk" + str;
}
}
public delegate string DGReturn (string str);
}
委托可以接受多个参数.pdf
private void Form1_Load(object sender, EventArgs e)
{
DGSayHi dg = new DGSayHi(sayHi);
dg += sayHI;
List<string> list = new List<string>();
dg("小白", list);
foreach (string item in list)
{
MessageBox.Show(item);
}
}
void sayHi(string str, List<string> listRes)
{
listRes.Add("sayHi第一个" + str);
}
void sayHI(string str, List<string> listRes)
{
listRes.Add("sayHi第二个" + str);
}
}
public delegate void DGSayHi(string str,List<string> listRes);
}
事件 的用法.pdf
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WindowsFormsApplication7
{
public class btnClass:System.Windows.Forms.Button
{
public btnClass()
{
base.Click += btnClass_Click;
}
int clickTimes = 1;
public event DGTripleClick dgTriple;
void btnClass_Click(object sender, EventArgs e)
{
if (clickTimes < 3)
{
clickTimes++;
}
else
{
if (dgTriple != null)
{
dgTriple();
}
clickTimes = 1;
}
}
}
public delegate void DGTripleClick();
}
public Form1()
{
InitializeComponent();
this.btnClass1.dgTriple += TripleClick;
}
public void TripleClick()
{
MessageBox.Show("3333");
}
委托各种写法以及详细教程
委托各种写法以及详细教程
//1.创建委托类
//2.实例化类的对象 注意:实例化的时候 必须通过构造函数 传入一个方法
DGSayHi dgSayHi = new DGSayHi(SayHi);
//2.1向委托中 添加方法
dgSayHi += SayHi2;//编译后:dgSayHi = (DGSayHi) Delegate.Combine(dgSayHi, new DGSayHi(this.SayHi2));
dgSayHi = (DGSayHi)Delegate.Combine(dgSayHi, new DGSayHi(this.SayHi2));
//语法糖
dgSayHi = (DGSayHi)Delegate.Combine(dgSayHi, new DGSayHi(this.SayHi2));
dgSayHi += SayHi2;
dgSayHi = (DGSayHi)Delegate.Remove(dgSayHi, new DGSayHi(this.SayHi2));
dgSayHi = dgSayHi - SayHi2;
//3.调用委托的时候,一次性执行委托中所有的方法
dgSayHi();//编译后:dgSayHi.Invoke();
dgSayHi.Invoke();
dgSayHi.Invoke();
MessageBox.Show("删除一个方法后:");
//4.从委托中 删除 指定的方法
dgSayHi -= SayHi;//编译后:dgSayHi = (DGSayHi) Delegate.Remove(dgSayHi, new DGSayHi(this.SayHi));
dgSayHi();
事件.pdf(委托和事件有什么不同)
///
/// 委托和事件有什么不同
/// 1:关键字不同,委托是关键字delegate 事件是event
/// 2:定义不同:委托是有参数的,事件是没参数的,不需要写()
/// 3:绑定不同:委托是可以用=号把方法名称直接赋值,事件是要用+=的方式赋值
/// 4: 方法不同:委托触发的方法参数是自定义的,事件触发的方法参数是固定的 object sender 和 EventArgs
///
/// Sender就是触发这个事件的对象 PlayMusic t = sender as PlayMusic;
/// EventArgs是执行这个事件所需要的数据源, e里面带有参数可使用
///
/// 委托和事件有什么相同
/// 1:多播委托: 都是要+=或者-=的方式赋值
///
/// 事件的作用
/// 事件的作用于委托变量一样,只是功能上委托变了有更多的限制
/// 只能通过+=或者-=的方式,只能在类的内部调用事件
///
反射5大对象
对象为Assembly 可以获取到程序集文件
对象Type 可以获取到当前程序集的所有类文件
对象MethodInfo 可以获得类的方法的对象
对象PropertyInfo可以获得类的字段的对象
对象FieldInfo 可以获得类的属性的对象
对象EventInfo 可以获得类的事件的对象
Methodinfo属性调用静态方法.pdf
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WindowsFormsApplication11
{
public class Student
{
public int ID;
public string Name { get; set; }
public bool Gender;
public string ShowLove(string targetName)
{
return targetName + ", i love u .msg from " + this.Name;
}
public Student(string name)
{
this.Name = name;
}
public static string RunForLove(string targetName)
{
return "byebey" + targetName;
}
}
}
反射与接口2
1:拿到plug文件夹的路径(先拿到记事本程序集的路径,在得到记事本程序集同级目录的plug文件夹的路径)
//this.GetType().Assembly
//1.2获取 插件文件夹 路径 注意:获取的是程序所在的文件夹路径
string strPath = System.IO.Path.GetDirectoryName(curAssembly.Location) + @"\plug\";
2:判断里面是否有第三方插件程序集
A:(plug文件夹放了第三方插件)根据plug文件夹拿到plug文件夹里面的所有以dll后缀名结束的第三方插件的路径
//1.3获取 插件文件夹 里的 dll 文件路径
string [] dllPaths = System.IO.Directory.GetFiles(strPath, "*.dll");
B:根据这个第三方插件生成类的对象
//*准备一个 插件接口 类型对象(用于判断记事本软件提供的接口标准是否与第三方公司写接口一致)
反射与接口
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 第三方公司插件
{
using 记事本公司提供的插件标准;
public class PlugOne:IPlug
{
public string PlugName
{
get
{
return "全部变成大写";
}
}
public string ProcessText(string strOri)
{
return strOri.ToUpper();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 第三方公司插件
{
using 记事本公司提供的插件标准;
public class PlugTwo:IPlug
{
public string PlugName
{
get { return "全部变成小写"; }
}
public string ProcessText(string strOri)
{
return strOri.ToLower();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 记事本公司提供的插件标准
{
public interface IPlug
{
string ProcessText(string strOri);
string PlugName { get; }
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 记事本主程序
{
using System.Reflection;
using System.IO;
using 记事本公司提供的插件标准;
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//获取正在运行的程序集
Assembly ass = Assembly.GetExecutingAssembly();
//获取程序集的4种方法
//Assembly ass1 = this.GetType().Assembly;
//Assembly[] asses = AppDomain.CurrentDomain.GetAssemblies();
反射PPT教程
string url = context.Request.Url;//index.aspx
//2 得到不带有扩展名的文件名称
string preStr = System.IO.Path.GetFileNameWithoutExtension(url);
//3 定义要反射类的完全限定名称
string fullName = "myIIS.Pages." + preStr;
//4 反射创建 index类的对象
IHttpHandler handler = this.GetType().Assembly.CreateInstance(fullName) as IHttpHandler;
//4.将 页面对象 存入 上下文中
context.MapHandler = handler;
反射在ef中的应用.pdf
#region 3.2 根据指定条件 修改 +int ModifyBy(Expression<Func> whereLambda)
///
/// 2.3 根据指定条件 修改
///
/// 条件表达式
/// 要修改的属性名
/// 属性要修改的值
///
public int ModifyBy(Expression<Func> whereLambda, string[] propertyNames, object[] perpertyValues)
{
//1.查询要修改的对象集合
var list = db.Set().Where(whereLambda).ToList();
//2.获取 要修改对象 的类型属性
Type t = typeof(T);
//3.循环 要修改的 实体对象,并根据 要修改的属性名 修改对象对应的属性值
foreach (var item in list)
{
//循环 要修改的属性 名称, 并 反射取出 t 中的 属性对象
for (int index = 0; index < propertyNames.Length;index++ )
{
//获取要修改的属性名
string pName = propertyNames[index];
//获取属性对象
PropertyInfo pi = t.GetProperty(pName);
01:详解C#中的反射.pdf
两个现实中的例子:
1、B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的生理情况。这是如何做到的呢?B超是B型超声波,它可以透过肚皮通过向你体内发射B型超声波,当超声波遇到内脏壁的时候就会产生一定的“回音”反射,然后把“回音”进行处理就可以显示出内脏的情况了(我不是医生也不是声学专家,不知说得是否准确^_^)。
2、地球内部结构:地球的内部结构大体可以分为三层:地壳、地幔和地核。地壳是固体,地核是液体,地幔则是半液半固的结构(中学地理的内容,大家还记得吧?)。如何在地球表面不用深入地球内部就知道其内部的构造呢?对,向地球发射“地震波”,“地震波”分两种一种是“横波”,另一种是“纵波”。“横波”只能穿透固体,而“纵波”既可穿透固体又可以穿透液体。通过在地面对纵波和横波的反回情况,我们就可以大体断定地球内部的构造了。
大家注意到这两个例子的共同特点,就是从一个对象的外部去了解对象内部的构造,而且都是利用了波的反射功能。在.NET中的反射也可以实现从对象的外部来了解对象(或程序集)内部结构的功能,哪怕你不知道这个对象(或程序集)是个什么东西,另外.NET中的反射还可以运态创建出对象并执行它其中的方法。
反射是.NET中的重要机制,通过反射,可以在运行时获得程序或程序集中每一个类型(包括类、结构、委托、接口和枚举等)的成员和成员的信息。有了反射,即可对每一个类型了如指掌。另外我还可以直接创建对象,即使这个对象的类型在编译时还不知道。
反射的用途:
(1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例。
(2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。
(3)使用ConstructorInfo了解构造函数的名称、参数、访问修饰符(如pulic 或private)和实现详细信息(如abstract或virtual)等。
(4)使用MethodInfo了解方法的名称、返回类型、参数、访问修饰符(如pulic 或private)和实现详细信息(如abstract或virtual)等。
(5)使用FiedInfo了解字段的名称、访问修饰符(如public或private)和实现详细信息(如static)等,并获取或设置字段值。
(6)使用EventInfo了解事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等,添加或移除事件处理程序。
(7)使用PropertyInfo了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态等,获取或设置属性值。
(8)使用ParameterInfo了解参数的名称、数据类型、是输入参数还是输出参数,以及参数在方法签名中的位置等。
反射用到的命名空间:
System.Reflection
System.Type
System.Reflection.Assembly
反射用到的主要类:
System.Type 类--通过这个类可以访问任何给定数据类型的信息。
System.Reflection.Assembly类--它可以用于访问给定程序集的信息,或者把这个程序集加载到程序中。
System.Type类:
System.Type 类对于反射起着核心的作用。但它是一个抽象的基类,Type有与每种数据类型对应的派生类,我们使用这个派生类的对象的方法、字段、属性来查找有关该类型的所有信息。
获取给定类型的Type引用有3种常用方式:
●使用 C# typeof 运算符。
Type t = typeof(string);
●使用对象GetType()方法。
string s = "grayworm";
Type t = s.GetType();
●还可以调用Type类的静态方法GetType()。
Type t = Type.GetType("System.String");
上面这三类代码都是获取string类型的Type,在取出string类型的Type引用t后,我们就可以通过t来探测string类型的结构了。
string n = "grayworm";
Type t = n.GetType();
foreach (MemberInfo mi in t.GetMembers())
{
Console.WriteLine("{0}/t{1}",mi.MemberType,mi.Name);
}
Type类的属性:
Name 数据类型名
FullName 数据类型的完全限定名(包括命名空间名)
Namespace 定义数据类型的命名空间名
IsAbstract 指示该类型是否是抽象类型
IsArray 指示该类型是否是数组
IsClass 指示该类型是否是类
IsEnum 指示该类型是否是枚举
IsInterface 指示该类型是否是接口
IsPublic 指示该类型是否是公有的
IsSealed 指示该类型是否是密封类
IsValueType 指示该类型是否是值类型
Type类的方法:
GetConstructor(), GetConstructors():返回ConstructorInfo类型,用于取得该类的构造函数的信息
GetEvent(), GetEvents():返回EventInfo类型,用于取得该类的事件的信息
GetField(), GetFields():返回FieldInfo类型,用于取得该类的字段(成员变量)的信息
GetInterface(), GetInterfaces():返回InterfaceInfo类型,用于取得该类实现的接口的信息
GetMember(), GetMembers():返回MemberInfo类型,用于取得该类的所有成员的信息
GetMethod(), GetMethods():返回MethodInfo类型,用于取得该类的方法的信息
GetProperty(), GetProperties():返回PropertyInfo类型,用于取得该类的属性的信息
可以调用这些成员,其方式是调用Type的InvokeMember()方法,或者调用MethodInfo, PropertyInfo和其他类的Invoke()方法。
查看类中的构造方法:
NewClassw nc = new NewClassw();
Type t = nc.GetType();
ConstructorInfo[] ci = t.GetConstructors(); //获取类的所有构造函数
foreach (ConstructorInfo c in ci) //遍历每一个构造函数
{
ParameterInfo[] ps = c.GetParameters(); //取出每个构造函数的所有参数
foreach (ParameterInfo pi in ps) //遍历并打印所该构造函数的所有参数
{
Console.Write(pi.ParameterType.ToString()+" "+pi.Name+",");
}
Console.WriteLine();
}
泛型笔记.pdf
1;继承一个泛型类时,必须为其传递泛型参数
public class Father<K,V> -------整个叫泛型
K,V ----泛型参数
2;定义子类时直接为父类泛型参数赋值
public class Son:Father<K,V>
public class Son:Father<int,string>
一个泛型子类继承一个泛型父类时,可以直接为父类的泛型参数赋值
3;定义子类时把子类泛型参数,同时为父类泛型参数赋值
public class Son<W,Y>:Father(W,Y)
一个泛型子类继承一个泛型父类时,子类泛型参数传值给父类泛型参数
Son--Father
4; 定义子类时子类泛型参数给定占位符,同时父类泛型参数可以赋值
public class Son<W,Y>:Father<int,string>
5:一个泛型子类继承一个泛型父类时,父类 的站位符是之前定义好的参数,不可以出现其他占位符
知识点 B:
2013-01-30 泛型、反射.pdf
一、泛型
为什么要有泛型集合(List<T>,Dictionary<K,V>,LinkedList<T>)?
1.为了避免装箱拆箱;
2.复用集合类里的 代码(算法) List<string> List<int>
1.概念
1.1官方:是一种特殊的【算法重用】机制。允许程序员在代码中将 变量或参数的类型 先用【类型占位符】来代替,等到运行的时候再根据传入的【类】来替换
通俗:类也可以带参数了!但是这个参数必须是 类型!用来在 类的代码中 暂时代替 类的位置,然后会在运行时,被替换。
【例子】:
public class MyList<T>
{
T[] arr;
public MyList(T[] arrp)
{
arr = arrp;
}
}
2.语法
2.1泛型的运行
当 运行的时候,JIT会帮我们生成泛型类的不同版本,通过如下代码可以验证:
//aa是MyList中一个int的静态变量
MyList<string>.aa = 11;
MyList<int>.aa = 22;
//照理说,同为MyList类的静态变量,应该保存最后一次赋值的 22
//但是输出的时候,确实生成了两个不同的版本
Console.WriteLine(MyList<string>.aa.ToString());//11
Console.WriteLine(MyList<int>.aa.ToString());//22
//由此看出,JIT在运行代码的时候,分别为带不同的 泛型参数 的MyList类生成了不同的版本。
MyList<string>.dd = new Dog();
MyList<string>.dd.age = 11;
MyList<int>.dd = new Dog();
MyList<int>.dd.age = 22;
Console.WriteLine(MyList<string>.dd.age.ToString());//11
Console.WriteLine(MyList<int>.dd.age.ToString());//22
【问题】为什么JIT在执行的是有要根据泛型类 MyList<T>里的T 来产生不同的 MyList类的版本?
因为 只有当T确定为某种类型的时候,JIT才有可能计算出 当前MyList类的对象在内存中要分配多大的空间。
3.泛型约束
3.1基类约束
public class House<TPet,TPet2>
where TPet:Dog //约束 TPet必须是 Dog或Dog的子类
where TPet2:Cat //约束 TPet必须是 Cat或Cat的子类
{
TPet pet1;
TPet2 pet2;
}