Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Dapper
提交
c340cffd
D
Dapper
项目概览
int
/
Dapper
大约 1 年 前同步成功
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
Dapper
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
c340cffd
编写于
5月 09, 2011
作者:
M
mgravell
浏览文件
操作
浏览文件
下载
差异文件
Automated merge with
https://dapper-dot-net.googlecode.com/hg/
上级
896ec6da
a24e15c3
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
49 addition
and
10 deletion
+49
-10
Dapper/SqlMapper.cs
Dapper/SqlMapper.cs
+19
-10
Tests/Tests.cs
Tests/Tests.cs
+30
-0
未找到文件。
Dapper/SqlMapper.cs
浏览文件 @
c340cffd
...
...
@@ -681,7 +681,7 @@ private static object GetStructDeserializer<T>(IDataReader reader)
})
.
Where
(
info
=>
info
.
Setter
!=
null
)
.
ToList
();
var
fields
=
typeof
(
T
).
GetFields
(
BindingFlags
.
Public
|
BindingFlags
.
NonPublic
|
BindingFlags
.
Instance
);
if
(
length
==
-
1
)
{
length
=
reader
.
FieldCount
-
startBound
;
...
...
@@ -695,9 +695,11 @@ private static object GetStructDeserializer<T>(IDataReader reader)
var
setters
=
(
from
n
in
names
let
prop
=
properties
.
FirstOrDefault
(
p
=>
string
.
Equals
(
p
.
Name
,
n
,
StringComparison
.
InvariantCulture
))
// case sensitive first
??
properties
.
FirstOrDefault
(
p
=>
string
.
Equals
(
p
.
Name
,
n
,
StringComparison
.
InvariantCultureIgnoreCase
))
// case insensitive second
select
new
{
Name
=
n
,
Info
=
prop
}
let
prop
=
properties
.
FirstOrDefault
(
p
=>
string
.
Equals
(
p
.
Name
,
n
,
StringComparison
.
InvariantCulture
))
// property case sensitive first
??
properties
.
FirstOrDefault
(
p
=>
string
.
Equals
(
p
.
Name
,
n
,
StringComparison
.
InvariantCultureIgnoreCase
))
// property case insensitive second
let
field
=
prop
!=
null
?
null
:
(
fields
.
FirstOrDefault
(
p
=>
string
.
Equals
(
p
.
Name
,
n
,
StringComparison
.
InvariantCulture
))
// field case sensitive third
??
fields
.
FirstOrDefault
(
p
=>
string
.
Equals
(
p
.
Name
,
n
,
StringComparison
.
InvariantCultureIgnoreCase
)))
// field case insensitive fourth
select
new
{
Name
=
n
,
Property
=
prop
,
Field
=
field
}
).
ToList
();
...
...
@@ -714,7 +716,7 @@ private static object GetStructDeserializer<T>(IDataReader reader)
var
@allDone
=
il
.
DefineLabel
();
foreach
(
var
item
in
setters
)
{
if
(
item
.
Info
!=
null
)
if
(
item
.
Property
!=
null
||
item
.
Field
!=
null
)
{
il
.
Emit
(
OpCodes
.
Dup
);
// stack is now [target][target]
Label
isDbNullLabel
=
il
.
DefineLabel
();
...
...
@@ -731,15 +733,22 @@ private static object GetStructDeserializer<T>(IDataReader reader)
il
.
Emit
(
OpCodes
.
Brtrue_S
,
isDbNullLabel
);
// stack is now [target][target][value-as-object]
// unbox nullable enums as the primitive, i.e. byte etc
var
nullUnderlyingType
=
Nullable
.
GetUnderlyingType
(
item
.
Info
.
Type
);
var
unboxType
=
nullUnderlyingType
!=
null
&&
nullUnderlyingType
.
IsEnum
?
nullUnderlyingType
:
item
.
Info
.
Type
;
Type
memberType
=
item
.
Property
!=
null
?
item
.
Property
.
Type
:
item
.
Field
.
FieldType
;
var
nullUnderlyingType
=
Nullable
.
GetUnderlyingType
(
memberType
);
var
unboxType
=
nullUnderlyingType
!=
null
&&
nullUnderlyingType
.
IsEnum
?
nullUnderlyingType
:
memberType
;
il
.
Emit
(
OpCodes
.
Unbox_Any
,
unboxType
);
// stack is now [target][target][typed-value]
if
(
nullUnderlyingType
!=
null
&&
nullUnderlyingType
.
IsEnum
)
{
il
.
Emit
(
OpCodes
.
Newobj
,
item
.
Info
.
Type
.
GetConstructor
(
new
[]
{
nullUnderlyingType
}));
il
.
Emit
(
OpCodes
.
Newobj
,
memberType
.
GetConstructor
(
new
[]
{
nullUnderlyingType
}));
}
if
(
item
.
Property
!=
null
)
{
il
.
Emit
(
OpCodes
.
Callvirt
,
item
.
Property
.
Setter
);
// stack is now [target]
}
else
{
il
.
Emit
(
OpCodes
.
Stfld
,
item
.
Field
);
// stack is now [target]
}
il
.
Emit
(
OpCodes
.
Callvirt
,
item
.
Info
.
Setter
);
// stack is now [target]
il
.
Emit
(
OpCodes
.
Br_S
,
finishLabel
);
// stack is now [target]
il
.
MarkLabel
(
isDbNullLabel
);
// incoming stack: [target][target][value]
...
...
Tests/Tests.cs
浏览文件 @
c340cffd
...
...
@@ -322,6 +322,36 @@ public void TestMultiMapDynamic()
connection
.
Execute
(
"drop table #Users drop table #Posts"
);
}
public
void
TestFieldsAndPrivates
()
{
var
data
=
connection
.
Query
<
TestFieldCaseAndPrivatesEntity
>(
@"select a=1,b=2,c=3,d=4,f='5'"
).
Single
();
data
.
a
.
IsEqualTo
(
1
);
data
.
GetB
().
IsEqualTo
(
2
);
data
.
c
.
IsEqualTo
(
3
);
data
.
GetD
().
IsEqualTo
(
4
);
data
.
e
.
IsEqualTo
(
5
);
}
private
class
TestFieldCaseAndPrivatesEntity
{
public
int
a
{
get
;
set
;
}
private
int
b
{
get
;
set
;
}
public
int
GetB
()
{
return
b
;
}
public
int
c
=
0
;
private
int
d
=
0
;
public
int
GetD
()
{
return
d
;
}
public
int
e
{
get
;
set
;
}
private
string
f
{
get
{
return
e
.
ToString
();
}
set
{
e
=
int
.
Parse
(
value
);
}
}
}
public
void
TestMultiReaderBasic
()
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录