Вопрос проверки NerdDinner с использованием VB.Net - PullRequest
2 голосов
/ 23 апреля 2009

Вопрос новичка. Я пишу приложение ASP.Net MVC в VB.Net и использую NerdDinner в качестве примера (который находится в C #). Я застрял в процессе проверки, в частности кода, найденного в Models \ Dinner.cs. Я попытался преобразовать его в VB.Net, используя http://www.developerfusion.com/tools/convert/csharp-to-vb/, но он подавляется оператором Yield, который находится в методе GetRuleViolations (см. Код ниже) Так что мой вопрос, как бы вы сделали эквивалент в VB.Net?

Пространство имен NerdDinner.Models {

[Bind(Include="Title,Description,EventDate,Address,Country,ContactPhone,Latitude,Longitude")]
public partial class Dinner {

    public bool IsHostedBy(string userName) {
        return HostedBy.Equals(userName, StringComparison.InvariantCultureIgnoreCase);
    }

    public bool IsUserRegistered(string userName) {
        return RSVPs.Any(r => r.AttendeeName.Equals(userName, StringComparison.InvariantCultureIgnoreCase));
    }

    public bool IsValid {
        get { return (GetRuleViolations().Count() == 0); }
    }

    public IEnumerable<RuleViolation> GetRuleViolations() {

        if (String.IsNullOrEmpty(Title))
            yield return new RuleViolation("Title is required", "Title");

        if (String.IsNullOrEmpty(Description))
            yield return new RuleViolation("Description is required", "Description");

        if (String.IsNullOrEmpty(HostedBy))
            yield return new RuleViolation("HostedBy is required", "HostedBy");

        if (String.IsNullOrEmpty(Address))
            yield return new RuleViolation("Address is required", "Address");

        if (String.IsNullOrEmpty(Country))
            yield return new RuleViolation("Country is required", "Address");

        if (String.IsNullOrEmpty(ContactPhone))
            yield return new RuleViolation("Phone# is required", "ContactPhone");

        if (!PhoneValidator.IsValidNumber(ContactPhone, Country))
            yield return new RuleViolation("Phone# does not match country", "ContactPhone");

        yield break;
    }

    partial void OnValidate(ChangeAction action) {
        if (!IsValid)
            throw new ApplicationException("Rule violations prevent saving");
    }
}

}

Ответы [ 2 ]

3 голосов
/ 23 апреля 2009

Получение «точного эквивалента» в VB потребует от вас пользовательской реализации IEnumerator (RuleViolation) с использованием значения состояния и оператора switch. Однако для чего-то такого простого это было бы излишним.

Вы можете получить "в основном эквивалентную" версию, создав список и заполнив его следующим образом:

public function GetRuleViolations() as IEnumerable(of RuleViolation)
    dim ret = new List(of RuleViolation)();

    'replace the ... with the appopriate logic from above.
    if ... then
        ret.Add(...)
    end if

    return ret
end function

Это немного менее эффективно, чем версия C #, поскольку она создает список и возвращает все элементы сразу, тогда как версия C # возвращает все элементы на лету, когда выполняется оператор "foreach". В этом случае список небольшой, поэтому это не имеет большого значения.

0 голосов
/ 23 апреля 2009

К сожалению, в VB.Net нет эквивалента оператору доходности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...