0

コードファーストアプローチですべての小数フィールドの精度を設定したい.そのために

このためのカスタム属性を作成します。

    [AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)]
    public sealed class DecimalPrecisionAttribute : Attribute
    {
        public DecimalPrecisionAttribute(byte precision, byte scale)
        {
            Precision = precision;
            Scale = scale;

        }

        public byte Precision { get; set; }
        public byte Scale { get; set; }

    }

使用して

    [DecimalPrecision(20,10)]
    public Nullable<decimal> DeliveryPrice { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        foreach (Type classType in from t in Assembly.GetAssembly(typeof(DecimalPrecisionAttribute)).GetTypes()
                                       where t.IsClass && t.Namespace == "YOURMODELNAMESPACE"
                                       select t)
         {
             foreach (var propAttr in classType.GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(p => p.GetCustomAttribute<DecimalPrecisionAttribute>() != null).Select(
                    p => new { prop = p, attr = p.GetCustomAttribute<DecimalPrecisionAttribute>(true) }))
             {

                 var entityConfig = modelBuilder.GetType().GetMethod("Entity").MakeGenericMethod(classType).Invoke(modelBuilder, null);
                 ParameterExpression param = ParameterExpression.Parameter(classType, "c");
                 Expression property = Expression.Property(param, propAttr.prop.Name);
                 LambdaExpression lambdaExpression = Expression.Lambda(property, true,
                                                                          new ParameterExpression[]
                                                                              {param});
                 DecimalPropertyConfiguration decimalConfig;
                 if (propAttr.prop.PropertyType.IsGenericType && propAttr.prop.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
                 {
                     MethodInfo methodInfo = entityConfig.GetType().GetMethods().Where(p => p.Name == "Property").ToList()[7];
                     decimalConfig = methodInfo.Invoke(entityConfig, new[] { lambdaExpression }) as DecimalPropertyConfiguration;
                 }
                 else
                 {
                     MethodInfo methodInfo = entityConfig.GetType().GetMethods().Where(p => p.Name == "Property").ToList()[6];
                     decimalConfig = methodInfo.Invoke(entityConfig, new[] { lambdaExpression }) as DecimalPropertyConfiguration;
                 }

                 decimalConfig.HasPrecision(propAttr.attr.Precision, propAttr.attr.Scale);
            }
        }
    }

エラーが検出されますが、

エラー 1 'System.Reflection.PropertyInfo' には 'GetCustomAttribute' の定義が含まれておらず、タイプ 'System.Reflection.PropertyInfo' の最初の引数を受け入れる拡張メソッド 'GetCustomAttribute' が見つかりませんでした (using ディレクティブまたはアセンブリ参照?)

どうすればこれを解決できますか?

4

0 に答える 0