Skip to content

Commit 5a907af

Browse files
committed
Fix copying custom attributes with array constructor arguments
1 parent 20cb7c6 commit 5a907af

3 files changed

Lines changed: 61 additions & 6 deletions

File tree

ImpromptuInterface/src/EmitProxy/ActLikeMaker.cs

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1433,11 +1433,36 @@ public static CustomAttributeBuilder ToCustomAttributeBuilder(CustomAttributeDat
14331433
{
14341434
return new CustomAttributeBuilder(
14351435
customAttributeData.Constructor,
1436-
customAttributeData.ConstructorArguments.Select(arg => arg.Value).ToArray(),
1437-
customAttributeData.NamedArguments.Where(arg => arg.MemberInfo.MemberType == MemberTypes.Property).Select(arg => arg.MemberInfo).Cast<PropertyInfo>().ToArray(),
1438-
customAttributeData.NamedArguments.Where(arg => arg.MemberInfo.MemberType == MemberTypes.Property).Select(arg => arg.TypedValue.Value).ToArray(),
1439-
customAttributeData.NamedArguments.Where(arg => arg.MemberInfo.MemberType == MemberTypes.Field).Select(arg => arg.MemberInfo).Cast<FieldInfo>().ToArray(),
1440-
customAttributeData.NamedArguments.Where(arg => arg.MemberInfo.MemberType == MemberTypes.Field).Select(arg => arg.TypedValue.Value).ToArray());
1436+
customAttributeData.ConstructorArguments
1437+
.Select(
1438+
arg =>
1439+
arg.Value?.GetType()
1440+
== typeof(ReadOnlyCollection<CustomAttributeTypedArgument>)
1441+
? ((ReadOnlyCollection<CustomAttributeTypedArgument>)arg.Value)
1442+
.Select(arrayArg => arrayArg.Value)
1443+
.ToArray()
1444+
: arg.Value
1445+
)
1446+
.ToArray(),
1447+
customAttributeData.NamedArguments
1448+
.Where(arg => arg.MemberInfo.MemberType == MemberTypes.Property)
1449+
.Select(arg => arg.MemberInfo)
1450+
.Cast<PropertyInfo>()
1451+
.ToArray(),
1452+
customAttributeData.NamedArguments
1453+
.Where(arg => arg.MemberInfo.MemberType == MemberTypes.Property)
1454+
.Select(arg => arg.TypedValue.Value)
1455+
.ToArray(),
1456+
customAttributeData.NamedArguments
1457+
.Where(arg => arg.MemberInfo.MemberType == MemberTypes.Field)
1458+
.Select(arg => arg.MemberInfo)
1459+
.Cast<FieldInfo>()
1460+
.ToArray(),
1461+
customAttributeData.NamedArguments
1462+
.Where(arg => arg.MemberInfo.MemberType == MemberTypes.Field)
1463+
.Select(arg => arg.TypedValue.Value)
1464+
.ToArray()
1465+
);
14411466
}
14421467

14431468

Tests/UnitTestImpromptuInterface/Basic.cs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,11 +444,30 @@ public void PropertyAttributeTest()
444444
{
445445
dynamic tNew = new ExpandoObject();
446446
ISimpeleSetClassProps tActsLike = Impromptu.ActLike<ISimpeleSetClassProps>(tNew);
447-
var attribute = (DisplayNameAttribute)tActsLike.GetType().GetProperty(nameof(ISimpeleSetClassProps.Prop1)).GetCustomAttribute(typeof(DisplayNameAttribute), true);
447+
var attribute = (DisplayNameAttribute)
448+
tActsLike
449+
.GetType()
450+
.GetProperty(nameof(ISimpeleSetClassProps.Prop1))
451+
.GetCustomAttribute(typeof(DisplayNameAttribute), true);
448452
Assert.NotNull(attribute);
449453
Assert.AreEqual("testDisplayName", attribute.DisplayName);
450454
}
451455

456+
[Test]
457+
public void PropertyAttributeWithArrayArgumentTest()
458+
{
459+
dynamic tNew = new ExpandoObject();
460+
ISimpeleSetClassProps tActsLike = Impromptu.ActLike<ISimpeleSetClassProps>(tNew);
461+
var attribute = (DisplayNamesAttribute)
462+
tActsLike
463+
.GetType()
464+
.GetProperty(nameof(ISimpeleSetClassProps.Prop2))
465+
.GetCustomAttribute(typeof(DisplayNamesAttribute), true);
466+
Assert.NotNull(attribute);
467+
Assert.AreEqual("testDisplayName1", attribute.DisplayNames[0]);
468+
Assert.AreEqual("testDisplayName2", attribute.DisplayNames[1]);
469+
}
470+
452471
[Test]
453472
public void EventDynamicPropertyTest()
454473
{

Tests/UnitTestImpromptuInterface/Support/SupportDefinitions.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,11 +102,22 @@ public interface ISimpeleClassProps
102102
Guid Prop3 { get; }
103103
}
104104

105+
public class DisplayNamesAttribute : Attribute
106+
{
107+
public string[] DisplayNames { get; }
108+
109+
public DisplayNamesAttribute(params string[] displayNames)
110+
{
111+
DisplayNames = displayNames;
112+
}
113+
}
114+
105115
public interface ISimpeleSetClassProps
106116
{
107117
[DisplayName("testDisplayName")]
108118
string Prop1 { set ; }
109119

120+
[DisplayNames("testDisplayName1", "testDisplayName2")]
110121
long Prop2 { set; }
111122

112123
Guid Prop3 { set; }

0 commit comments

Comments
 (0)