Как использовать кодовые контракты с запросом? - PullRequest
0 голосов
/ 13 октября 2009

Я довольно новичок в контрактах по коду ... и столкнулся с проблемой.

Я имею в запросе LINQ метода, который идет что-то вроде этого:

MyClass[] fields =
            (from p in rType.GetProperties()
             where p.CanRead
             let fAttr = p.GetCustomAttributes(typeof(MyClassAttribute), true).SingleOrDefault() as MyClassAttribute
             where fAttr != null
             select new MyClass(p, fAttr)).ToArray();

И я хочу внедрить кодовые контракты в моем проекте. Я сделал все хорошо, пока я не достиг этой точки. Когда я запускаю static checker, он предлагает мне добавить пару предварительных условий (Contract.Requires) в отношении переменных p и fAttr, которые определены в запросе. А еще у меня есть пара бездоказательных требований.

Как я могу решить это? Есть идеи?

MyClass также содержит два предварительных условия:

internal MyClass(PropertyInfo p, MyClassAttribute att)
    {
        Contract.Requires(p != null);
        Contract.Requires(att != null);
        ...
    }

Заранее спасибо:)

1 Ответ

0 голосов
/ 19 января 2011

Я не могу воспроизвести это. Используете ли вы последнюю версию Code Contracts?

Весь мой код выглядит так ... это достаточно близко к вашей версии?

using System;
using System.Diagnostics.Contracts;
using System.Linq;
using System.Reflection;

namespace ConsoleApplication10
{
    class Program
    {
        class MyClassAttribute : Attribute{}
        class MyClass
        {
            internal MyClass(PropertyInfo p, MyClassAttribute a)
            {
                Contract.Requires(p != null);
                Contract.Requires(a != null);
            }
        }

        static void Main(string[] args)
        {
            var rType = typeof (DateTime);

            MyClass[] result = (from p in rType.GetProperties()
             where p.CanRead
             let fAttr = p.GetCustomAttributes(typeof(MyClassAttribute), true).SingleOrDefault() as MyClassAttribute
             where fAttr != null
             select new MyClass(p, fAttr)).ToArray();

        }
    }
}
...