// Copyright Keysight Technologies 2012-2019
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, you can obtain one at http://mozilla.org/MPL/2.0/.
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
namespace OpenTap
{
///
/// Represents the members of C#/dotnet types.
///
public class MemberData : IMemberData
{
struct MemberName
{
public string Name { get; set; }
public Type DeclaringType { get; set; }
}
static ConcurrentDictionary dict
= new ConcurrentDictionary();
internal static void InvalidateCache()
{
dict.Clear();
}
///
/// Creates a new MemberData for a member of a C#/dotnet type.
///
///
///
static public MemberData Create(MemberInfo info)
{
lock(dict)
return dict.GetOrAdd(new MemberName { Name = info.Name, DeclaringType = info.DeclaringType }, x => new MemberData(x.Name, TypeData.FromType(x.DeclaringType)));
}
/// The System.Reflection.MemberInfo this represents.
public readonly MemberInfo Member;
private MemberData(string name, TypeData declaringType) : this(declaringType.Type.GetMember(name)[0], declaringType)
{ }
private MemberData(MemberInfo info, TypeData declaringType)
{
if (info == null)
throw new ArgumentNullException(nameof(info));
this.Member = info;
this.DeclaringType = declaringType;
}
IEnumerable