Skip to content
/ NCaller Public template
forked from night-moon-studio/Leo

使用Natasha构建快速动态操作字段/属性

License

Notifications You must be signed in to change notification settings

jangocheng/NCaller

 
 

Repository files navigation

中文 | English

NCaller

Member project of Night Moon Studio NuGet Badge GitHub repo size Badge GitHub license


持续构建(CI Build Status)

CI Platform Build Server Master Test
Github linux/mac/windows Build status

项目简介:

此项目为Natasha的衍生项目,通过运行时自动构建高性能操作代理类,为普通类,静态类,动态类,动态类中的动态类,动态生成的静态类等提供了良好的、完备的、高性能的操作,成员索引及类型缓存均采用高性能算法进行重建,如果反射、dynamic都不能满足高端的需求,可使用本类库,它将是一个不错的选择。


发布计划:

  • 2019-08-01 : 发布v1.0.0.0, 高性能动态调用库。



性能展示:

性能对比


使用方法(User Api):


  • 引入 动态构件库: NMS.NCaller

  • 引入 编译环境库: DotNetCore.Compile.Environment

  • 向引擎中注入定制的域: DomainManagement.RegisterDefault< AssemblyDomain >()

  • 敲代码


算法引用

https://github.com/dotnet-lab/BTFindTree


选用操作类:

//DictOperator : 字典风格的操作,默认使用的是精确最小权方法构建属性/字段索引。
CallerManagement.AddType(typeof(A));
var handler = DictOperator.CreateFromType(typeof(A));
var handler = DictOperator.CreateFromString("A");
var handler = DictOperator<A>.Create();


 
//HashDictOperator : 字典风格的操作,默认使用的哈希二分查找方法构建属性/字段索引。
CallerManagement.AddType(typeof(A));
var handler = HashDictOperator.CreateFromType(typeof(A));
var handler = HashDictOperator.CreateFromString("A");
var handler = HashDictOperator<A>.Create();



//FuzzyDictOperator : 字典风格的操作,默认使用的模糊指针查找方法构建属性/字段索引。
CallerManagement.AddType(typeof(A));
var handler = FuzzyDictOperator.CreateFromType(typeof(A));
var handler = FuzzyDictOperator.CreateFromString("A");
var handler = FuzzyDictOperator<A>.Create();



//LinkOperator : 链式风格的操作,默认使用的是精确最小权方法构建属性/字段索引。
CallerManagement.AddType(typeof(A));
var handler = LinkOperator.CreateFromType(typeof(A));
var handler = LinkOperator.CreateFromString("A");
var handler = LinkOperator<A>.Create();



 
//HashLinkOperator : 链式风格的操作,默认使用的哈希二分查找方法构建属性/字段索引。
CallerManagement.AddType(typeof(A));
var handler = HashLinkOperator.CreateFromType(typeof(A));
var handler = HashLinkOperator.CreateFromString("A");
var handler = HashLinkOperator<A>.Create();



//FuzzyLinkOperator : 链式风格的操作,默认使用的模糊指针查找方法构建属性/字段索引。
CallerManagement.AddType(typeof(A));
var handler = FuzzyLinkOperator.CreateFromType(typeof(A));
var handler = FuzzyLinkOperator.CreateFromString("A");
var handler = FuzzyLinkOperator<A>.Create();

动态调用普通/静态类:

public class A
{
   public int Age;
   public DateTime Time;
   public B Outter = new B();
}

public class B
{
   public string Name;
   public B()
   {
      Name = "小明"
   }
}


//Link调用
CallerManagement.AddType(typeof(A));
var handler = LinkOperator.CreateFromType(typeof(A));

handler.New();

handler["Age"].Set(100);                                          // Set Operator
handler.Set("Age", 100);                                          // Set Operator

Console.WriteLine(handler["Time"].Get<DateTime>());               // Get Operator
Console.WriteLine(handler.Get<DateTime>("Time"));                 // Get Operator

handler.Get("Outter")["Name"].Set("NewName");                     // Link Operator
handler.Get<B>("Outter").Name = "NewName";                        // Link Operator


//字典调用
CallerManagement.AddType(typeof(A));
var handler = DictOperator.CreateFromType(typeof(A));
handler.New();

handler["Age"]= 100;                                          // Set Operator
handler.Set("Age", 100);                                      // Set Operator

Console.WriteLine(handler["Time"]);                           // Get Operator
Console.WriteLine(handler.Get<DateTime>("Time"));             // Get Operator

((B)handler["Outter"]).Name = "NewName";                      // Link Operator


动态代理类:

//可以对 接口/虚方法/抽象方法 进行覆盖及实现。
//缓存采用精确查找树实现,以自实现的类名做Key, 提高查询性能。
ProxyOperator<ITest> builder = new ProxyOperator<ITest>();
builder.OopName("ITestClass");
//builder["MethodName"] = "MethodBody";
builder["SayHello"] = "Console.WriteLine(\"Hello World!\");";
var test = builder.CreateProxy("ITestClass");
test.SayHello();


License

FOSSA Status

About

使用Natasha构建快速动态操作字段/属性

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C# 100.0%