最近一直在写自己刚兴趣的一些代码,也在不断的思考总学习,提高。自己的小框架也基本上打好了基石,因为界面啊应用了ExtJs 所以动态加载导航条成了必须解决的问题。
以前写过一个用stringBuilder根据集合拼装为Json字符串的类,最近怎么看怎么别扭,于是在网上找了一些资料,最近写了一个扩展类来对实体类进行Json字符串的正反序列化.
写的有什么不好的希望大家指正,也希望跟园子里面的同行一起讨论,下面废话少说上代码.
实现Json转换的标记接口.
namespace Binary.Net.Common
{
/// <summary>
/// 这是一个标记接口,没有任何方法.该接口提供可转化为Json字符串的实体类的标记功能.
/// </summary>
public interface IJsonable
{
}
}
对标记接口做的静态扩展方法.
namespace Binary.Net.Common
{
/// <summary>
/// 提供Json字符串与对象转化之间的扩展方法.
/// </summary>
public static class JsonConvert
{
/// <summary>
/// 对实现了IJsonable标记接口的实体类,提供Json字符串的转化.
/// </summary>
/// <param name="data">转化数据</param>
/// <returns>Json格式的字符串</returns>
public static string GetJsonString(this IJsonable data)
{
using (MemoryStream memoryStrem = new MemoryStream())
{
DataContractJsonSerializer dataContractJsonSerializer = new DataContractJsonSerializer(data.GetType());
StringBuilder stringBuilder = new StringBuilder();
dataContractJsonSerializer.WriteObject(memoryStrem, data);
stringBuilder.Append(Encoding.UTF8.GetString(memoryStrem.ToArray()));
return stringBuilder.ToString();
}
}
/// <summary>
/// 对Json字符串提供,转化为实体对象的方法.
/// </summary>
/// <typeparam name="T">T 对象类型</typeparam>
/// <param name="jsonString">Json 格式化字符串</param>
/// <returns>T 类型对象</returns>
public static T GetJsonObject<T>(this string jsonString)
{
using (MemoryStream memoryStrem = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)))
{
DataContractJsonSerializer dataContractJsonSerializer = new DataContractJsonSerializer(typeof(T));
T jsonObject = (T)dataContractJsonSerializer.ReadObject(memoryStrem);
memoryStrem.Close();
return jsonObject;
}
}
}
}
调用示例:
public class CarEntity : IJsonable
{
private int carId;
public int CarId
{
get { return carId; }
set { carId = value; }
}
private string userName;
public string UserName
{
get { return userName; }
set { userName = value; }
}
private string Type;
public string Type1
{
get { return Type; }
set { Type = value; }
}
}
调用方法如下:
CarEntity car = new CarEntity();
car.CarId = 8574919;
car.UserName = "申菲菲";
car.Type1 = "BWM";
string A = car.GetJsonString();
CarEntity v = A.GetJsonObject<CarEntity>();
Console.Write(car.GetJsonString()+"\n");
Console.Write(v.CarId+"\n");
Console.Write(v.UserName +"\n");
Console.Write(v.Type1 +"\n");
Console.Read();
运行结果:

至此Json字符串转化到此结束,希望大家批评指正。
View Code
class Program
{
static void Main(string[] args)
{
Subject sub1 = new Subject();
Observer_1 ob1 = new Observer_1("NO.1");
Observer_1 ob2 = new Observer_1("NO.2");
sub1.AddObserver(ob1);
sub1.AddObserver(ob2);
sub1.Notify();
Console.Read();
}
}
class Subject
{
private List<IObserverable> observerContainer = new List<IObserverable>();
public void AddObserver(IObserverable observer)
{
this.observerContainer.Add(observer);
}
public void RemoveObserver(IObserverable observer)
{
this.observerContainer.Remove(observer);
}
public void Notify()
{
foreach (IObserverable o in this.observerContainer)
{
Console.WriteLine(o.ObserverName);
o.Update();
}
}
}
interface IObserverable
{
string ObserverName { get; }
void Update();
}
class Observer_1 : IObserverable
{
private string _ObserverName;
public Observer_1(string observerName)
{
this._ObserverName = observerName;
}
public string ObserverName
{
get { return _ObserverName; }
}
public void Update()
{
Console.WriteLine(this.ObserverName + ": Is updated.");
}
}
class Observer_2 : IObserverable
{
private string _ObserverName;
public Observer_2(string observerName)
{
this._ObserverName = observerName;
}
public string ObserverName
{
get { return _ObserverName; }
}
public void Update()
{
Console.WriteLine(this.ObserverName + ": Is updated.");
}
}
废话少说,今天自己下了 ref 与 out 例子,发现了如下问题,先看代码
class Program
{
static void Main(string[] args)
{
int i = 0;
int x = 0;
RefTest(ref i);
RefTest1(ref x);
int j,y;
OutTest(out j);
OutTest1(out y);
Console.WriteLine("J--->value:" + j);
ParamTest();
ParamTest(1, 2, 3);
ParamTest(4, 5, 6, 7);
Console.Read();
}
static void RefTest(ref int i)
{
i = i + 1;
Console.WriteLine(i);
}
static void RefTest1(ref int x)
{
x = x++;
Console.WriteLine(x);
}
static void OutTest(out int j)
{
j = 0;
j = j +1;
Console.WriteLine(j);
}
static void OutTest1(out int y)
{
y = 0;
y = y ++;
Console.WriteLine(y);
}
static void ParamTest(params int[] iList)
{
if (iList.Length > 0)
{
Console.WriteLine("Params Number is:" + iList.Length);
for (int i = 0; i < iList.Length; i++)
{
Console.Write("Params[{0}]--->value:", i);
Console.WriteLine(iList[i]);
}
}
else
{
Console.WriteLine("Params Not is Used");
}
}
}
运行以上结果 :

大家 可以看一下 在调用 同等的 refTest(),outtest()与refTest1(),outTest1()方法的时候,唯一区别的地方是 i=i+1;与i=i++这两处,结果完全迥异,不明白为什么,希望高手解答。
在用 ref 与 out的时候 i++ 失效了。
1 -- =============================================
2 -- Author: xf
3 -- Create date: 2011-12-7
4 -- Description: 1.0.0.0
5 -- =============================================
6 CREATE PROCEDURE [dbo].[Proc_Platform_Paging]
7 -- Add the parameters for the stored procedure here
8 (
9 @Table varchar(100),
10 @Fields varchar(2000),
11 @Where nvarchar(2000),
12 @PageSize int,
13 @PageIndex int,
14 @Orders varchar(500),
15 @Count int out
16 )
17 AS
18 BEGIN
19 DECLARE @SQL NVARCHAR(4000)
20 declare @MaxID int
21 declare @MinID int
22 set @MaxID = @PageIndex*@PageSize;
23 set @MinID = (@PageIndex-1)*@PageSize;
24 set @Fields = 'ROW_NUMBER() OVER (ORDER BY '+@Orders+') AS RowNumber,'+@Fields;
25 set @Where = 'RowNumber>'+CAST(@MinID AS NVARCHAR)+' and RowNumber<='+CAST(@MaxID AS NVARCHAR)
26 if @PageIndex > 0
27 begin
28 SET @SQL = 'SELECT * FROM (SELECT '+@Fields+' FROM '+@Table+') as T WHERE '+@Where+' order By '+@Orders
29 end
30 else
31 begin
32 SET @SQL = 'SELECT * FROM (SELECT '+@Fields+' FROM '+@Table+') as T WHERE RowNumber>0 and RowNumber<='+CAST(@PageSize AS NVARCHAR)+' order By '+@Orders
33 end
34 print @sql
35 exec sp_executesql @SQL;
36 END
小菜毕业后,一直在北京一家小公司任职。公司的其他方面不想多说,就技术方面小菜学到了很多。
对于中小型公司来说,项目的开发效率与收益有着直接的关系。然而,快而又高效尽量少得Bug开发,一直是公司开发所迫切需要解决的问题。基于此问题,各个公司就根据经验与时间,日积月累下有了自己的类库,资源库。小到自己封装的控件,大到自己开发的平台。其中有着各种我们要学习的知识。小菜不才,也有点小冲动。打算自己开发一条快速开发的平台(旨对Web的企业应用开发)。
大部分web开发其实就是与数据库打交道,那么与数据库开发的中间键DBhelper 我想大家都不陌生。小菜自己也实现了一把,只当抛砖引玉,万望各位大牛批评指正。
小菜的自定义的顶层程序集为Donet(汗),ODBC(object Data Base Connection 这个是我的理解!再汗),好了废话少说,先看一下类图

此类支持32中以ADo.net方式访问数据库的方法,后期将会加入内存参数,优化性能。由于代码过多在此不再赘述。


