Полагаю, здесь также можно спросить, как долго имя созданного типа прикрепляется к анонимному типу. Вот проблема:
В блоге было что-то вроде этого:
var anonymousMagic = new {test.UserName};
lblShowText.Text = lblShowText
.Text
.Format("{UserName}", test);
Как список пожеланий и несколько способов сделать это. Будучи скучающим и предприимчивым, я занялся созданием метода расширения строки, который мог бы справиться с этим:
var anonymousMagic = new {test.UserName, test.UserID};
lblShowText.Text = "{UserName} is user number {UserID}"
.FormatAdvanced(anonymousMagic);
С мыслью, что я получу информацию о свойствах от анонимного типа и сопоставлю ее со строками в скобках. Теперь с информацией о свойствах приходит отражение, поэтому я хотел бы сохранить информацию о свойствах при первом обращении к типу, чтобы мне не пришлось получать ее снова. Итак, я сделал что-то вроде этого:
public static String FormatAdvanced(this String stringToFormat, Object source)
{
Dictionary<String, PropertyInfo> info;
Type test;
String typeName;
//
currentType = source.GetType();
typeName = currentType.Name;
//
//info list is a static list for the class holding this method
if (infoList == null)
{
infoList = new Dictionary<String, Dictionary<String, PropertyInfo>>();
}
//
if (infoList.ContainsKey(typeName))
{
info = infoList[typeName];
}
else
{
info = test.GetProperties()
.ToDictionary(item => item.Name);
infoList.Add(typeName, info);
}
//
foreach (var propertyInfoPair in info)
{
String currentKey;
String replacement;
replacement = propertyInfoPair.Value.GetValue(source, null).ToString();
currentKey = propertyInfoPair.Key;
if (stringToFormat.Contains("{" + currentKey + "}"))
{
stringToFormat = stringToFormat
.Replace("{" + currentKey + "}", replacement);
}
}
//
return stringToFormat;
}
Теперь при тестировании кажется, что оно сохраняет имя, созданное для анонимного типа, чтобы во второй раз получить информацию о свойствах не из типа, а из словаря.
Если несколько человек одновременно используют этот метод, будет ли он работать в режиме Session, например, в режиме fastsion; IE названия типов будут специфичны для каждого экземпляра программы? Или это будет еще хуже? В какой момент это имя забрасывается и перезаписывается?