You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
206 lines
7.8 KiB
206 lines
7.8 KiB
using System.Reflection;
|
|
using System.Xml.Linq;
|
|
using Bodk.Device.Storage.Attributes;
|
|
using Bodk.Device.Storage.Summary;
|
|
|
|
namespace Bodk.Device.Storage;
|
|
|
|
public static class TypeExtensions
|
|
{
|
|
public static TypeDescription GetTypeInfo(this Type type)
|
|
{
|
|
var result = new TypeDescription();
|
|
var xmlFilePath = $"{type.Assembly.GetName().Name}.xml"; // 假设XML文件与程序集同名
|
|
xmlFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, xmlFilePath);
|
|
if (System.IO.File.Exists(xmlFilePath))
|
|
{
|
|
var xml = XDocument.Load(xmlFilePath);
|
|
|
|
// 获取公共属性
|
|
foreach (var property in type.GetProperties(BindingFlags.Public | BindingFlags.Instance))
|
|
{
|
|
if (property.GetCustomAttribute<IgnoreAttribute>() != null ||
|
|
property.GetCustomAttribute<NotSupportAttribute>() != null)
|
|
continue;
|
|
var propertySummary = xml.Root?
|
|
.Elements("members")
|
|
.Elements()
|
|
.FirstOrDefault(m => m.Attribute("name")?.Value != null &&
|
|
m.Attribute("name").Value.Contains("P:") &&
|
|
m.Attribute("name").Value.Contains(property.Name))?
|
|
.Elements("summary")
|
|
.FirstOrDefault()?.Value.Replace("\n", "").Trim();
|
|
|
|
var propertyDescription = new PropertyDescription
|
|
{
|
|
Name = property.Name,
|
|
Type = property.PropertyType.GetTypeEnum(),
|
|
Summary = propertySummary ?? "No summary available",
|
|
CanWrite = property.CanWrite
|
|
};
|
|
if (property.CanWrite)
|
|
{
|
|
MethodInfo? setMethod = property.GetSetMethod();
|
|
if (setMethod is null)
|
|
propertyDescription.CanWrite = false;
|
|
else
|
|
{
|
|
bool isInternal = setMethod.IsAssembly || setMethod.IsFamilyOrAssembly;
|
|
if (isInternal)
|
|
{
|
|
propertyDescription.CanWrite = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
result.Properties.Add(propertyDescription);
|
|
}
|
|
|
|
// 获取公共方法
|
|
foreach (var method in type.GetMethods(BindingFlags.Public | BindingFlags.Instance))
|
|
{
|
|
if (method.GetCustomAttribute<IgnoreAttribute>() != null ||
|
|
method.GetCustomAttribute<NotSupportAttribute>() != null)
|
|
continue;
|
|
if (method.Name.Contains("ToString") || method.Name.Contains("Equals") ||
|
|
method.Name.Contains("GetHashCode") || method.Name.Contains("GetType")
|
|
|| method.Name.Contains("GetTypeInfo") || method.Name.Contains("_"))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
var methodSummary = xml.Root?
|
|
.Elements("members")
|
|
.Elements()
|
|
.FirstOrDefault(m =>
|
|
m.Attribute("name").Value != null && m.Attribute("name").Value.Contains(method.Name))?
|
|
.Elements("summary")
|
|
.FirstOrDefault()?.Value.Replace("\n", "").Trim();
|
|
|
|
var methodDescription = new MethodDescription
|
|
{
|
|
Name = method.Name,
|
|
ReturnType = method.ReturnType.GetTypeEnum(),
|
|
ReturnTypeSummary = (xml.Root?
|
|
.Elements("members")
|
|
.Elements()
|
|
.FirstOrDefault(m =>
|
|
m.Attribute("name")?.Value != null && m.Attribute("name").Value.Contains(method.Name))?
|
|
.Elements("returns")
|
|
.FirstOrDefault()?.Value ?? "no summary").Replace("\n", "").Trim(),
|
|
Summary = methodSummary ?? "No summary available"
|
|
};
|
|
if (method.GetCustomAttribute<SwitchAttribute>() != null)
|
|
methodDescription.Type = 2;
|
|
|
|
// 获取方法参数
|
|
foreach (var parameter in method.GetParameters())
|
|
{
|
|
var parameterSummary = xml.Root?
|
|
.Elements("members")
|
|
.Elements()
|
|
.FirstOrDefault(m =>
|
|
m.Attribute("name").Value != null && m.Attribute("name").Value.Contains(method.Name))?
|
|
.Elements("param")
|
|
.FirstOrDefault(p =>
|
|
p.Attribute("name").Value != null && p.Attribute("name")?.Value == parameter.Name)?
|
|
.Value.Replace("\n", "").Trim();
|
|
|
|
methodDescription.Parameters.Add(new MethodDescription.ParameterDescription
|
|
{
|
|
Name = parameter.Name,
|
|
Type = parameter.ParameterType.GetTypeEnum(),
|
|
Summary = parameterSummary ?? "No summary available"
|
|
});
|
|
}
|
|
|
|
result.Methods.Add(methodDescription);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// 如果XML文件不存在,使用默认的摘要
|
|
foreach (var property in type.GetProperties(BindingFlags.Public | BindingFlags.Instance))
|
|
{
|
|
var propertyDescription = new PropertyDescription
|
|
{
|
|
Name = property.Name,
|
|
Type = property.PropertyType.GetTypeEnum(),
|
|
Summary = "No summary available",
|
|
CanWrite = property.CanWrite
|
|
};
|
|
if (property.CanWrite)
|
|
{
|
|
MethodInfo setMethod = property.GetSetMethod();
|
|
bool isInternal = setMethod.IsAssembly || setMethod.IsFamilyOrAssembly;
|
|
if (isInternal)
|
|
{
|
|
propertyDescription.CanWrite = false;
|
|
}
|
|
}
|
|
|
|
result.Properties.Add(propertyDescription);
|
|
}
|
|
|
|
foreach (var method in type.GetMethods(BindingFlags.Public | BindingFlags.Instance))
|
|
{
|
|
var methodDescription = new MethodDescription
|
|
{
|
|
Name = method.Name,
|
|
ReturnType = method.ReturnType.GetTypeEnum(),
|
|
ReturnTypeSummary = "No summary available",
|
|
Summary = "No summary available"
|
|
};
|
|
|
|
foreach (var parameter in method.GetParameters())
|
|
{
|
|
methodDescription.Parameters.Add(new MethodDescription.ParameterDescription
|
|
{
|
|
Name = parameter.Name,
|
|
Type = parameter.ParameterType.GetTypeEnum(),
|
|
Summary = "No summary available"
|
|
});
|
|
}
|
|
|
|
result.Methods.Add(methodDescription);
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
public static TypeEnum GetTypeEnum(this Type type)
|
|
{
|
|
if (type == typeof(int))
|
|
{
|
|
return TypeEnum.Int;
|
|
}
|
|
|
|
if (type == typeof(float))
|
|
{
|
|
return TypeEnum.Float;
|
|
}
|
|
|
|
if (type == typeof(double))
|
|
{
|
|
return TypeEnum.Double;
|
|
}
|
|
|
|
if (type == typeof(string))
|
|
{
|
|
return TypeEnum.String;
|
|
}
|
|
|
|
if (type == typeof(bool))
|
|
{
|
|
return TypeEnum.Bool;
|
|
}
|
|
|
|
if (type == typeof(ushort))
|
|
{
|
|
return TypeEnum.UShort;
|
|
}
|
|
|
|
return TypeEnum.Unknown;
|
|
}
|
|
}
|