首先第一步
通过反射实现字符串调用程序集下的类
比如我们有一些功能类库、需要动态调用
如下:
namespace Sin365AIProject_01
{
public class B_Test1
{
public void GetT1()
{
Console.WriteLine("T1方法调用成功");
}
public void GetT2()
{
Console.WriteLine("T2方法调用成功");
}
}
}
那么我们先写一个方法做反射实现、
四个参数、
分别是 程序集名称、类的名称、要调用的方法名称、
以及 要调用的方法的参数集合
代码如下
/// <summary>
///
/// </summary>
/// <param name="AssemblyName"></param>
/// <param name="ClassFullName"></param>
/// <param name="Method"></param>
static void RefMainSet(string AssemblyName, string ClassFullName, string MethodName, object[] parameters)
{
//指定程序集、类名 获取类
Type type = Assembly.Load(AssemblyName).GetType(ClassFullName);
//需要调用的方法名
MethodInfo meth = type.GetMethod(MethodName);
//判断是否是静态方法
if (!meth.IsStatic)
//由于静态类和非静态类处理
基本概念:
首先总所周知、在C#反射机制中、
最基础的反射用法之一,
就是使用字符串的方式,
获得指定的程序集下的具体类、
并调用指定的方法、或者函数。
那么、可想而知、
我们的C#、java、objective-c中、
如果非常灵活的设计、可以做非常有趣的事情。
那么、在不使用正儿八经的“机器学习”和“人工智能”技术的前提下,
我们能做到多么智能的交互呢?
有趣的思路:
在C# 和 java 等语言中、
我们是可以用字符串指定具体程序集的方法(C#)、
具体包名下的类的方法(java)。
那么、整个程序可以只留一个文本输入模块儿、
可以直接让用户输入字符串、调用不同的方法。
但是、 具体的方法调用字符、在各种语言中、都相对复杂。
让用户输入而且要保证准确的话。实在为难用户。
那么、前期就要解决几大问题:
1、如何让用户录入信息简单
2、如何便捷
3、如何让功能丰富、灵活
解决思路
1、
首先解决简单的问题、
可以把我们的功能方法们、的调用字符、
使用枚举、或者 key value、或者数组等等方式
把复杂的调用字符 标记成 简单的字符
比如 C#中 我们天气查询服务类 是“HaoYueList.weatherHelp.weatherServer”类下的
“getweather”方法
那么我们可以用 “天气”两个字代表这些复杂字符串。
当用户输入“天气”、或者其他简单标记的 单字 单词 即可调用方法。
然后可以支持模糊查询。
遇到多个结果的询问用户。
比如用户输入“查”字、
然后模糊查询、
再询问用户
您是需要以下的哪种服务:
查物流
查天气
查星座运势
2 、
用户输入、我们可以使用 百度语音识别、等第三方的语音识别服务。
来吧用户直接说错词语、来转换成字符串。
代替文字输入。
达到输入上的便捷。
那么、再交互、提示上、使用语音读给用户。
加上我们的模糊查询、和语音询问用户。
变得便捷。
3、
使用类似插件化、组件化、等开发方式。
并在方法上标记好、方法自己的方法简化单词名称。
动态加载方法、和简化单词名称。
能够动态加载功能、
预处理命令
#if
#else
#elif
#endif
#define
#undef
#warning
#error
#line
#region
#endregion
#pragma
#pragma warning
#pragma checksum
参考 msdn 文档:
https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/preprocessor-directives/
//如果在调试环境下
#if DEBUG
Console.WriteLine("Debug version");
#endif
//判断框架版本
//如果在.net 4.7版本下
#if NET47
Console.WriteLine("Debug version");
#endif
目标框架 :符号
.NET Framework :NET20, NET35, NET40, NET45, NET451, NET452, NET46, NET461, NET462, NET47, NET471, NET472
.NET Standard: NETSTANDARD1_0, NETSTANDARD1_1, NETSTANDARD1_2, NETSTANDARD1_3, NETSTANDARD1_4, NETSTANDARD1_5, NETSTANDARD1_6, NETSTANDARD2_0
.NET 核心 :NETCOREAPP1_0, NETCOREAPP1_1, NETCOREAPP2_0, NETCOREAPP2_1
#define VC7
//...
//#elif #else 的使用
#if debug
Console.Writeline("Debug build");
#elif VC7
Console.Writeline("Visual Studio 7");
#endif
BackgroundWorker 顾名思义 就是后台工作 后台运行的意思
现在我写一个用法示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Threading;
namespace t1
{
class Program
{
static void Main(string[] args)
{
System.ComponentModel.BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += delegate (object sender, DoWorkEventArgs e)
{
Thread.Sleep(5000);
Console.WriteLine("后台三秒执行完成");
};
worker.RunWorkerAsync();
Console.WriteLine("主函数执行完毕");
Console.ReadLine();
}
}
}
输出结果是
主函数执行完毕
后台三秒执行完成
说明延迟操作是成功了的。
------下面认真的话 你就输了----------
那么我们继续喜闻乐见的探究一下、
BackgroundWorker 是交给程序本身在运行、还是交给系统托管的
我们去掉最后的Console.ReadLine();即程序主流程执行完、控制台应用程序就结束。
然后我们在中间的delegate里的sleep后面 加入写入文件操作的代码
等待在控制台程序输出完成并终止命令窗之后、看是否有文件写入
using System;
using System.Collections.Gener
private void btn_send_Click(object sender, EventArgs e)
{
var emailAcount = ConfigurationManager.AppSettings["EmailAcount"];
var emailPassword = ConfigurationManager.AppSettings["EmailPassword"];
var reciver = txt_Reciver.Text;
var content = rtxt_Content.Text;
MailMessage message = new MailMessage();
//设置发件人,发件人需要与设置的邮件发送服务器的邮箱一致
MailAddress fromAddr = new MailAddress("qwe123@qq.com");
message.From = fromAddr;
//设置收件人,可添加多个,添加方法与下面的一样
message.To.Add(reciver);
//设置抄送人
message.CC.Add("qwe123@163.com");
//设置邮件标题
message.Subject = "Test";
//设置邮件内容
message.Body = content;
//设置邮件发送服务器,服务器根据你使用的邮箱而不同,可以到相应的 邮箱管理后台查看,下面是QQ的
SmtpClient client = new SmtpClient("smtp.qq.com", 25);
//设置发送人的邮箱账号和密码
client.Cre
DateTime date1 = DateTime.Now;
/*
* 要处理的内容 A
*/
DateTime date2 = DateTime.Now;
DateTime date3 = DateTime.Now;
/*
* 要处理的内容 B
*/
DateTime date4 = DateTime.Now;
TimeSpan timeSpan1 = date2 - date1;
TimeSpan timeSpan2 = date4 - date3;
Console.WriteLine("A的运算需要了" + (timeSpan1).TotalMilliseconds + "毫秒");
Console.WriteLine("B的运算需要了" + (timeSpan2).TotalMilliseconds + "毫秒");
Console.WriteLine("两次运行的时间差" + (timeSpan1 - timeSpan2).TotalMilliseconds+ "毫秒");
Console.ReadLine();
首先直接运行得出时间差计算过程本身的时间消耗、
我这台办公室电脑,Debug模式下运行
得到的 平均值是 0.3毫秒~0.4毫秒
心理先有个数。
然后接下来放入需要测试的代码
DateTime date1 = DateTime.Now;
/*
* 要处理的内容 A
*/
int i1 = 1;
for (long i = 0; i < 1000000; i++)
{
i1 += i1;
}
DateTim
string sPath = Environment.GetEnvironmentVariable("Path");
foreach(var l in sPath.Split(';'))
Console.WriteLine(l);
#region Chrome书签结构实体类
public class GoogleChrome_BookMarkALLModel
{
public string checksum { get; set; }
public GoogleChrome_BookMark_roots roots { get; set; }
public string version { get; set; }
}
public class GoogleChrome_BookMark_roots
{
public GoogleChrome_BookMark_bookmark_bar_other_synced bookmark_bar { get; set; }
public GoogleChrome_BookMark_bookmark_bar_other_synced other { get; set; }
public GoogleChrome_BookMark_bookmark_bar_other_synced synced { get; set; }
}
public class GoogleChrome_BookMark_bookmark_bar_other_synced
{
public string date_added { get; set; }
public string date_modified { get; set; }
public string id { get; set; }
public string name { get; set; }
public string type { get; set; }
public List<GoogleChrome_BookMark_children> children { get; set; }
}
public class GoogleChrome_BookMark_ch
使用mysql/mariaDB
当你升级了项目的EntityFramework版本
导致在VS中生成实体类的时候 提示
您的项目引用了最新实体框架;但是,找不到数据链接所需的与版本兼容的实体框架
不要着急
这时候请检查这两个 是否是最新 不是最新的话就去官网重新下载安装
mysql-for-visualstudio
mysql-connector-net
然后 在VS的NuGet中去重新安装
MySql.Data.Entity.EF6 组件
然后在你config中的里
应该有名为MySql.Data.MySqlClient的东西了
然后现在你就可以愉快的生成mysql的EF实体类了、
如果还是那样提示的话、
重新生成一次解决方案就好。
加密 方式
public string Encrypt(string toEncrypt, string key, string iv)
{
byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key);
byte[] ivArray = UTF8Encoding.UTF8.GetBytes(iv);
byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyArray;
rDel.IV = ivArray;
rDel.Mode = CipherMode.CBC;
rDel.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = rDel.CreateEncryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
public string Decrypt(string toDecrypt, string key, string iv)
{
byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key);