Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit d7e8e03

Browse files
committed
Implement more of PclExport.NetStandard
1 parent 36c976d commit d7e8e03

File tree

2 files changed

+92
-14
lines changed

2 files changed

+92
-14
lines changed

src/ServiceStack.Text/PclExport.NetStandard.cs

Lines changed: 82 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,17 @@
66
using System.Collections.Generic;
77
using System.IO;
88
using System.Linq;
9-
using System.Reflection;
109
using ServiceStack.Text;
1110
using ServiceStack.Text.Common;
1211
using ServiceStack.Text.Json;
1312
using System.Globalization;
13+
using System.Reflection;
1414
using System.Reflection.Emit;
1515

1616
#if NETSTANDARD1_3
1717
using System.Collections.Specialized;
1818
using System.Net;
1919
using System.Linq.Expressions;
20-
using System.Runtime.Serialization;
2120
#endif
2221

2322
namespace ServiceStack
@@ -439,16 +438,6 @@ private static StringCollection ParseStringCollection<TSerializer>(string value)
439438
return result;
440439
}
441440
#endif
442-
443-
public override Type UseType(Type type)
444-
{
445-
if (type.IsInterface() || type.IsAbstract())
446-
{
447-
return DynamicProxy.GetInstanceFor(type).GetType();
448-
}
449-
return type;
450-
}
451-
452441
public override ParseStringDelegate GetJsReaderParseMethod<TSerializer>(Type type)
453442
{
454443
if (type.AssignableFrom(typeof(System.Dynamic.IDynamicMetaObjectProvider)) ||
@@ -495,6 +484,87 @@ public override string GetStackTrace()
495484
}
496485
#endif
497486

487+
public override SetPropertyDelegate GetSetPropertyMethod(PropertyInfo propertyInfo)
488+
{
489+
return CreateIlPropertySetter(propertyInfo);
490+
}
491+
492+
public override SetPropertyDelegate GetSetFieldMethod(FieldInfo fieldInfo)
493+
{
494+
return CreateIlFieldSetter(fieldInfo);
495+
}
496+
497+
public override SetPropertyDelegate GetSetMethod(PropertyInfo propertyInfo, FieldInfo fieldInfo)
498+
{
499+
return propertyInfo.CanWrite
500+
? CreateIlPropertySetter(propertyInfo)
501+
: CreateIlFieldSetter(fieldInfo);
502+
}
503+
504+
public override Type UseType(Type type)
505+
{
506+
if (type.IsInterface() || type.IsAbstract())
507+
{
508+
return DynamicProxy.GetInstanceFor(type).GetType();
509+
}
510+
return type;
511+
}
512+
513+
public static SetPropertyDelegate CreateIlPropertySetter(PropertyInfo propertyInfo)
514+
{
515+
var propSetMethod = propertyInfo.SetMethod;
516+
if (propSetMethod == null)
517+
return null;
518+
519+
var setter = CreateDynamicSetMethod(propertyInfo);
520+
521+
var generator = setter.GetILGenerator();
522+
generator.Emit(OpCodes.Ldarg_0);
523+
generator.Emit(OpCodes.Castclass, propertyInfo.DeclaringType);
524+
generator.Emit(OpCodes.Ldarg_1);
525+
526+
generator.Emit(propertyInfo.PropertyType.IsClass()
527+
? OpCodes.Castclass
528+
: OpCodes.Unbox_Any,
529+
propertyInfo.PropertyType);
530+
531+
generator.EmitCall(OpCodes.Callvirt, propSetMethod, (Type[])null);
532+
generator.Emit(OpCodes.Ret);
533+
534+
return (SetPropertyDelegate)setter.CreateDelegate(typeof(SetPropertyDelegate));
535+
}
536+
537+
public static SetPropertyDelegate CreateIlFieldSetter(FieldInfo fieldInfo)
538+
{
539+
var setter = CreateDynamicSetMethod(fieldInfo);
540+
541+
var generator = setter.GetILGenerator();
542+
generator.Emit(OpCodes.Ldarg_0);
543+
generator.Emit(OpCodes.Castclass, fieldInfo.DeclaringType);
544+
generator.Emit(OpCodes.Ldarg_1);
545+
546+
generator.Emit(fieldInfo.FieldType.IsClass()
547+
? OpCodes.Castclass
548+
: OpCodes.Unbox_Any,
549+
fieldInfo.FieldType);
550+
551+
generator.Emit(OpCodes.Stfld, fieldInfo);
552+
generator.Emit(OpCodes.Ret);
553+
554+
return (SetPropertyDelegate)setter.CreateDelegate(typeof(SetPropertyDelegate));
555+
}
556+
557+
private static DynamicMethod CreateDynamicSetMethod(MemberInfo memberInfo)
558+
{
559+
var args = new[] { typeof(object), typeof(object) };
560+
var name = string.Format("_{0}{1}_", "Set", memberInfo.Name);
561+
var returnType = typeof(void);
562+
563+
return !memberInfo.DeclaringType.IsInterface()
564+
? new DynamicMethod(name, returnType, args, memberInfo.DeclaringType, true)
565+
: new DynamicMethod(name, returnType, args, memberInfo.Module, true);
566+
}
567+
498568
public static void InitForAot()
499569
{
500570
}

src/ServiceStack.Text/project.json

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
"System.Dynamic.Runtime": "4.0.11",
3030
"Microsoft.CSharp": "4.0.1-*",
3131
"System.Reflection.Emit": "4.0.1",
32+
"System.Reflection.Emit.LightWeight" : "4.0.1",
33+
"System.Reflection.Extensions": "4.0.1",
3234
"System.Linq.Expressions": "4.1.0"
3335
}
3436
},
@@ -44,10 +46,16 @@
4446
"System.Net.Requests": "4.0.11",
4547
"System.Dynamic.Runtime": "4.0.11",
4648
"Microsoft.CSharp": "4.0.1-*",
49+
"System.Linq.Expressions": "4.1.0",
50+
"System.Collections": "4.0.11",
51+
"System.Collections.Concurrent": "4.0.12",
52+
"System.Collections.NonGeneric": "4.0.1",
53+
"System.Collections.Specialized": "4.0.1",
54+
"System.Reflection": "4.1.0",
4755
"System.Reflection.Emit": "4.0.1",
56+
"System.Reflection.Emit.Lightweight": "4.0.1",
4857
"System.Reflection.Extensions": "4.0.1",
49-
"System.Linq.Expressions": "4.1.0",
50-
"System.Collections.Specialized": "4.0.1"
58+
"System.Reflection.TypeExtensions": "4.1.0"
5159
}
5260
},
5361
".NETPortable,Version=v4.5,Profile=Profile7": {

0 commit comments

Comments
 (0)