https://github.com/iplaylf2/lf2bitconverter
BitConverter
https://github.com/iplaylf2/lf2bitconverter
c-sharp dotnet-standard expression-tree
Last synced: 8 months ago
JSON representation
BitConverter
- Host: GitHub
- URL: https://github.com/iplaylf2/lf2bitconverter
- Owner: iplaylf2
- Created: 2018-10-08T16:06:08.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2018-10-31T09:53:49.000Z (over 7 years ago)
- Last Synced: 2025-03-16T05:19:49.485Z (about 1 year ago)
- Topics: c-sharp, dotnet-standard, expression-tree
- Language: C#
- Homepage:
- Size: 56.6 KB
- Stars: 1
- Watchers: 1
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# LF2BitConverter
System.BitConverter的扩展版,使用同样的编码格式。用于自定义对象与Byte[]互转。
## 用法
接口简单,支持大小端转换。
``` C#
//Convert字段顺序为类型定义时的顺序
//转换的类型也是定义时的类型
class Foo
{
public Int32 A;
public Int32 B;
}
void Demo()
{
Foo foo = new Foo { A = 1, B = 2 };
Byte[] littleEndian_bytes = BitConverterEX.LittleEndian.GetBytes(foo); //new Byte[]{1,0,0,0,2,0,0,0}
Byte[] bigEndian_bytes = BitConverterEX.BigEndian.GetBytes(foo); //new Byte[]{0,0,0,1,0,0,0,2}
Int32 startIndex = 0;
Foo new_foo_1 = BitConverterEX.LittleEndian.ToObject(littleEndian_bytes, ref startIndex); //{A=1,B=2}
startIndex = 0;
Foo new_foo_2 = BitConverterEX.BigEndian.ToObject(bigEndian_bytes, ref startIndex); //{A=1,B=2}
}
```
默认提供转换方法的类型为System.BitConverter支持的类型,以及Byte。
``` C#
class Foo
{
public Double A;
}
```
支持数组转换。
``` C#
class Foo
{
///
/// 按元素个数计数,固定长度为10的数组
///
[ConvertArray(CountBy.Item, Length = 10)]
public Int32 FooArray;
///
/// 存放BarArray getbytes后的字节数
///
public Int32 BarCount;
///
/// 按getbytes后字节长度计数,不定长度的数组
///
[ConvertArray(CountBy.Byte, LengthFrom = nameof(BarCount))]
public Char[] BarArray;
}
```
支持嵌套类型。
``` C#
class Foo
{
public Int32 A;
public Double B;
}
class Bar
{
///
/// 甚至支持嵌套类型的数组。
///
[ConvertArray(CountBy.Item, Length = 10)]
public Foo[] FooArray;
}
```
## 扩展
扩展方便,派生ConvertMemberAttribute后重写公共方法实现扩展。
``` C#
//派生ConvertAsAttribute,指定成员数值在转换时的类型。
class ConvertAsAttribute : ConvertMemberAttribute
{
public ConvertAsAttribute(Type type)
{
ConvertType = type;
}
public override Type OnGetConvertType(Type lastResult)
{
return ConvertType;
}
private readonly Type ConvertType;
}
enum Foo
{
A,B,C
}
class Bar
{
//枚举类型在转换时会被当作是Byte类型
[ConvertAs(typeof(Byte))]
public Foo Foo;
}
```
本库内置的转换数组ConvertArrayAttribute,转换字符串ConvertStringAttribute等皆通过派生ConvertMemberAttribute实现。
## 说明
使用表达式树动态构造转换函数,性能与手写转换代码相当。
更多demo在demo目录。