File: System\Reflection\Context\Virtual\VirtualPropertyInfo.PropertyGetter.cs
Web Access
Project: src\src\libraries\System.Reflection.Context\src\System.Reflection.Context.csproj (System.Reflection.Context)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.Reflection.Context.Custom;
 
namespace System.Reflection.Context.Virtual
{
    internal sealed partial class VirtualPropertyInfo
    {
        private sealed class PropertyGetter : PropertyGetterBase
        {
            private readonly Func<object, object?> _getter;
            private readonly IEnumerable<Attribute> _attributes;
 
            public PropertyGetter(VirtualPropertyBase property, Func<object, object?> getter, IEnumerable<Attribute>? getterAttributes)
                : base(property)
            {
                Debug.Assert(null != getter);
 
                _getter = getter;
                _attributes = getterAttributes ?? CollectionServices.Empty<Attribute>();
            }
 
            public override object? Invoke(object? obj, BindingFlags invokeAttr, Binder? binder, object?[]? parameters, CultureInfo? culture)
            {
                // invokeAttr, binder, and culture are ignored, similar to what runtime reflection does with the default binder.
 
                if (parameters != null && parameters.Length > 0)
                    throw new TargetParameterCountException();
 
                if (!ReflectedType!.IsInstanceOfType(obj))
                    throw new ArgumentException();
 
                return _getter(obj);
            }
 
            public override object[] GetCustomAttributes(Type attributeType, bool inherit)
            {
                return CollectionServices.IEnumerableToArray(AttributeUtils.FilterCustomAttributes(_attributes, attributeType), attributeType);
            }
 
            public override object[] GetCustomAttributes(bool inherit)
            {
                return CollectionServices.IEnumerableToArray(_attributes, typeof(Attribute));
            }
 
            public override IList<CustomAttributeData> GetCustomAttributesData()
            {
                return CollectionServices.Empty<CustomAttributeData>();
            }
 
            public override bool IsDefined(Type attributeType, bool inherit)
            {
                return GetCustomAttributes(attributeType, inherit).Length > 0;
            }
        }
    }
}