EF и Generic

Оставляю кусочек кода себе на память. Универсальный, но в моем случае требует костылей.

#region Generic
        public void CreateLang(TModel langModel, out IEnumerable diff)
        {
            Type entityType = this.TypesModelEntity[typeof(TModel)]; //вот костыль
            var langType = this.TypesEntityLang[entityType]; //и еще один

            Type genericClass = typeof(EFLangRepository);
            Type constructedClass = genericClass.MakeGenericType(typeof(TModel), entityType, langType);

            object repo = Activator.CreateInstance(constructedClass);

            diff = new List();
            object[] args = new object[] { langModel, diff };

            MethodInfo magicMethod = constructedClass.GetMethod("CreateLang");
            object magicValue = magicMethod.Invoke(repo, args);
            diff = args[1] as List;
        }
        #endregion

Continue Reading →

Enum to Dictionary с локализацией

Пример про локализацию
http://adamyan.blogspot.com/2010/02/aspnet-mvc-2-localization-complete.html

Пример с приведением enum к dictionary без лишних заморочек
http://stackoverflow.com/questions/5583717/enum-to-dictionary-c-sharp

var dict = Enum.GetValues(typeof(typFoo))
               .Cast()
               .ToDictionary(t => (int)t, t => t.ToString() );

Пример с generic-методом для enum
http://stackoverflow.com/questions/79126/create-generic-method-constraining-t-to-an-enum

public T GetEnumFromString(string value) where T : struct, IConvertible
{
   if (!typeof(T).IsEnum) 
   {
      throw new ArgumentException("T must be an enumerated type");
   }

   //...
}
public abstract class EnumClassUtils
where TClass : class
{

    public static TEnum Parse(string value)
    where TEnum : struct, TClass
    {
        return (TEnum) Enum.Parse(typeof(TEnum), value);
    }

}

public class EnumUtils : EnumClassUtils
{
}

Наконец, собранное воедино — generic-метод, преобразующий enum к словарю на нужном языке. Может быть, надо доработать.

public static Dictionary TranslateEnum() where TEnum : struct, IConvertible
        {
            if (!typeof(TEnum).IsEnum)
            {
                throw new ArgumentException("TEnum must be an enumerated type");
            }

            var lang = typeof(MyLangStrings);

            var dict = Enum.GetValues(typeof(TEnum))
               .Cast()
               .ToDictionary(t => (int)Enum.Parse(typeof(TEnum), t.ToString()), t =>
               {
                   var p = lang.GetProperty(t.ToString());
                   return p.GetValue(p.DeclaringType, null).ToString();
               });
            return dict;
        }