using System; namespace ProfilerHelpers { public class MethodInfo { private readonly ulong _startAddress; private readonly int _size; private readonly string _fullName; internal MethodInfo(ulong startAddress, int size, string namespaceAndTypeName, string name, string signature) { _startAddress = startAddress; _size = size; _fullName = ComputeFullName(startAddress, namespaceAndTypeName, name, signature); } private string ComputeFullName(ulong startAddress, string namespaceAndTypeName, string name, string signature) { var fullName = signature; // constructor case: name = .ctor | namespaceAndTypeName = A.B.typeName | signature = ... (parameters) // --> A.B.typeName(parameters) if (name == ".ctor") { return $"{namespaceAndTypeName}{ExtractParameters(signature)}"; } // general case: name = Foo | namespaceAndTypeName = A.B.typeName | signature = ... (parameters) // --> A.B.Foo(parameters) fullName = $"{namespaceAndTypeName}.{name}{ExtractParameters(signature)}"; return fullName; } private string ExtractTypeName(string namespaceAndTypeName) { var pos = namespaceAndTypeName.LastIndexOf(".", StringComparison.Ordinal); if (pos == -1) { return namespaceAndTypeName; } // skip the . pos++; return namespaceAndTypeName.Substring(pos); } private string ExtractParameters(string signature) { var pos = signature.IndexOf(" ("); if (pos == -1) { return "(???)"; } // skip double space pos += 2; var parameters = signature.Substring(pos); return parameters; } public ulong StartAddress => _startAddress; public int Size => _size; public string FullName => _fullName; } }