File: ObjectExtensions.cs
Web Access
Project: src\src\Workspaces\CoreTestUtilities\Microsoft.CodeAnalysis.Workspaces.Test.Utilities.csproj (Microsoft.CodeAnalysis.Workspaces.Test.Utilities)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
#nullable disable
 
using System;
using System.Reflection;
 
namespace Microsoft.CodeAnalysis.UnitTests;
 
public static class ObjectExtensions
{
    public static PropertyType GetPropertyValue<PropertyType>(this object instance, string propertyName)
    {
        return (PropertyType)GetPropertyValue(instance, propertyName);
    }
 
    public static object GetPropertyValue(this object instance, string propertyName)
    {
        var type = instance.GetType();
        var propertyInfo = type.GetProperty(propertyName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
        if (propertyInfo == null)
        {
            throw new ArgumentException("Property " + propertyName + " was not found on type " + type.ToString());
        }
 
        var result = propertyInfo.GetValue(instance, null);
        return result;
    }
 
    public static object GetFieldValue(this object instance, string fieldName)
    {
        var type = instance.GetType();
        FieldInfo fieldInfo = null;
        while (type != null)
        {
            fieldInfo = type.GetField(fieldName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
            if (fieldInfo != null)
            {
                break;
            }
 
            type = type.BaseType;
        }
 
        if (fieldInfo == null)
        {
            throw new FieldAccessException("Field " + fieldName + " was not found on type " + type.ToString());
        }
 
        var result = fieldInfo.GetValue(instance);
        return result; // you can place a breakpoint here (for debugging purposes)
    }
 
    public static FieldType GetFieldValue<FieldType>(this object instance, string fieldName)
    {
        return (FieldType)GetFieldValue(instance, fieldName);
    }
}