Reflectionを使用してジェネリックの種類のプロパティを引き出し、属性を探しているジェネリッククラスがあります。私はそれぞれのプロパティのそれぞれについて同じことをするために各プロパティに再帰しています。私の問題は、何らかのコレクションプロパティ(コレクションであるプロパティ)またはICollectionプロパティに来るときです。 GetValueから返された値を特定の型にキャストすることはできません(IEnumerableにキャストしようとしましたが、一般的なIEnumerableでは機能しません)。ここでReflectを持つGenericリスト/コレクションの処理項目
はもう少し理解するためのいくつかのコードです:
public class NotificationMessageProcessor<T> : INotificationProcessor<T>
{
IList<string> availableTags = new List<string>();
public string ReplaceNotificationTags<T>(string message, T instance)
{
LoadTagValues(instance);
return ReplaceTags(message);
}
private string ReplaceTags(string message)
{
foreach (KeyValuePair<string, string> tagVal in tagValues)
{
message = message.Replace(string.Format("<{0}>", tagVal.Key), tagVal.Value);
}
return message;
}
private void LoadTagValues(object val)
{
Type elementType = val.GetType();
PropertyInfo[] typeProperties = elementType.GetProperties();
foreach (PropertyInfo prop in typeProperties)
{
NotificationTag[] tags = (NotificationTag[])prop.GetCustomAttributes(typeof(NotificationTag), false);
if (tags != null && tags.Length > 0)
{
string tagName = tags[0].TagName;
object propValue = prop.GetValue(val, null);
string propTypeString = prop.PropertyType.FullName;
tagName = prop.ReflectedType.Name + "." + tagName;
if (propValue != null)
{
tagValues.Add(tagName, propValue.ToString());
}
if (propValue != null)
{
if (!prop.PropertyType.IsPrimitive)
{
LoadTagValues(propValue);
}
}
}
else
{
if (!prop.PropertyType.IsPrimitive)
{
object propValue = null;
if (prop.GetGetMethod().GetParameters().Count() == 0)
{
propValue = prop.GetValue(val, null);
}
else
{
//have a collection...need to process but do not know how many in collection....
propValue = prop.GetValue(val, new object[] { 0 });
}
if (propValue != null)
{
LoadTagValues(propValue);
}
}
}
}
}
NotificationMessageProcessor<User> userProcessor = new NotificationMessageProcessor();
userProcessor.ReplaceNotificationTags<User>(someMessage, instanceOfUser);
ユーザーオブジェクトは私が理解から、適切な属性
あなたが実際にやりたいことについてのいくつかの情報は役に立ちます - すべては抽象的なもので少し奇妙です。 –
私はいくつかのコードを追加しました.... – CSharpAtl
私はそれを考え出しました.... – CSharpAtl