操控平台后端代码
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

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;
}
}