1

検証クラスがあり、このクラス内で、Web サービスから受け取ったさまざまなプロパティが有効であることを確認し、そうでない場合は説明的なエラー メッセージを報告したいと考えています。

現在、Web サービスはすべての文字列を返します。これらをより便利な型に変換/検証したいと考えています。問題は、現在、メソッド呼び出しでプロパティ名を文字列パラメーターとして渡していることです。文字列として渡すことなく、エラー メッセージに表示するプロパティの名前を取得する方法はありますか?

public class WebserviceAccess
{
    public MyUsefulDataObject ConvertToUsefulDataObject(WebserviceResponse webserviceResponse)
    {
        var usefulData = new MyUsefulDataObject();

        usefulData.LastUpdated = webserviceResponse.LastUpdated.IsValidDateTime("LastUpdated");
        // etc . . .
        // But I don't want to have to pass "LastUpdated" through.
        // I'd like IsValidDateTime to work out the name of the property when required (in the error message).

        return usefulData ;
    }
}

public static class WebServiceValidator
{
    public static DateTime IsValidDateTime(this string propertyValue, string propertyName)
    {
        DateTime convertedDate;

        if (!DateTime.TryParse(propertyValue, out convertedDate))
        {
            throw new InvalidDataException(string.Format("Webservice property '{0}' value of '{1}' could not be converted to a DateTime.", propertyName, propertyValue));
        }

        return convertedDate;
    }
}

どんな援助も大歓迎です。

前もって感謝します。

編集: Oblivion2000 の提案を使用して、次のようになりました。

public class Nameof<T>
{
    public static string Property<TProp>(Expression<Func<T, TProp>> expression)
    {
        var body = expression.Body as MemberExpression;

        if (body == null)
        {
            throw new ArgumentException("'expression' should be a member expression");
        }

        return body.Member.Name;
    }
}

public class WebserviceAccess
{
    public MyUsefulDataObject ConvertToUsefulDataObject(WebserviceResponse webserviceResponse)
    {
        var usefulData = new MyUsefulDataObject();

        usefulData.LastUpdated = Nameof<WebserviceResponse>.Property(e => e.LastUpdated).IsValidDateTime(webserviceResponse.LastUpdated);
        // etc . . .

        return usefulData ;
    }
}

public static class WebServiceValidator
{
    public static DateTime IsValidDateTime(this string propertyName, string propertyValue)
    {
        DateTime convertedDate;

        if (!DateTime.TryParse(propertyValue, out convertedDate))
        {
            throw new InvalidDataException(string.Format("Webservice property '{0}' value of '{1}' could not be converted to a DateTime.", propertyName, propertyValue));
        }

        return convertedDate;
    }
}
4

2 に答える 2

0

これに関するCℓintonSheppardの投稿は次のとおりです:http: //handcraftsman.wordpress.com/2008/11/11/how-to-get-c-property-names-without-magic-strings/

ブックマークに入れておくととても便利です。個人的に、私は彼の静的なネストされたクラスの方法が好きです(上から引用):

public class Sample2
{
    public static class BoundPropertyNames
    {
        public static readonly string Foo = ((MemberExpression)((Expression<Func<Sample2, int>>)(s => s.Foo)).Body).Member.Name;
    }

    public int Foo { get; set; }
}
于 2012-05-11T14:06:47.417 に答える
0

Visual Studio 2011 には、これを処理する新しい機能があります: http://www.mitchelsellers.com/blogs/2012/02/29/visual-studio-11-caller-member-info-attributes.aspx

現在/古いバージョンでは、 Oblivion2000 の投稿のようなトリックを使用する必要があります

于 2012-05-11T13:56:20.233 に答える