38 lines
1.5 KiB
C#
38 lines
1.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using WatchFace.Parser.Attributes;
|
|
|
|
namespace WatchFace.Parser.Utils
|
|
{
|
|
internal class ElementsHelper
|
|
{
|
|
public static Dictionary<byte, PropertyInfo> SortedProperties<T>()
|
|
{
|
|
var typeInfo = typeof(T);
|
|
var properties = new Dictionary<byte, PropertyInfo>();
|
|
foreach (var propertyInfo in typeInfo.GetProperties())
|
|
{
|
|
var parameterIdAttribute = (ParameterIdAttribute) propertyInfo
|
|
.GetCustomAttributes(typeof(ParameterIdAttribute), false).FirstOrDefault();
|
|
if (parameterIdAttribute == null)
|
|
throw new ArgumentException(
|
|
$"Class {typeInfo.Name} doesn't have ParameterIdAttribute on property {propertyInfo.Name}"
|
|
);
|
|
if (properties.ContainsKey(parameterIdAttribute.Id))
|
|
throw new ArgumentException(
|
|
$"Class {typeInfo.Name} already has ParameterIdAttribute with Id {parameterIdAttribute.Id}"
|
|
);
|
|
|
|
properties[parameterIdAttribute.Id] = propertyInfo;
|
|
}
|
|
return properties.OrderBy(kv => kv.Key).ToDictionary(kv => kv.Key, kv => kv.Value);
|
|
}
|
|
|
|
public static T GetCustomAttributeFor<T>(PropertyInfo propertyInfo)
|
|
{
|
|
return (T) propertyInfo.GetCustomAttributes(typeof(T), false).FirstOrDefault();
|
|
}
|
|
}
|
|
} |