3

わかりました。あまり好きではないコードが少しあります。私はそれを書かず、単にそれを継承したことを考えると、私はそれを少しきれいにすることができたと思います。基本的に、NHibernateで永続化される設定のオブジェクトがあります。データベースに保持している実際の値を含む辞書が含まれていることを除いて、実装の詳細に飽きることはありません。

典型的なプロパティの実装は次のようになります。

public string MyDumbProperty
{
get { return GetStringValue("MyDumbProperty", string.Empty); }
set { SetValue("MyDumbProperty", value);}
}

さて、上記の実装から、返されるタイプ(strings、ints、longs、floatsなど)ごとに個別のGetxxxxメソッドがあり、2番目のパラメーターがデフォルト値であることがおそらく明らかです。私が望んでいるのは、次のようなことができるようにすることです。

public string MyDumbProperty
{
get { return GetValue("MyDumbProperty", string.Empty); }
set { SetValue("MyDumbProperty", value);}
}

これをやりたい理由はいくつかあります。大きな問題は、どのタイプのパラメーターを使用するかに基づいて名前が付けられたメソッドが個人的に嫌いなことです。2つ目は、このがらくたのためのresharperテンプレートを作成したいということです。次に、プロパティの名前とタイプを入力するだけで完了できます(resharperがタイプに適切なデフォルト値を与えることができると想定しています)。

Tを返すジェネリックメソッドGetValueを作成することを考えていましたが、これを実行できるようにジェネリック制約を設定する方法がわかりません。これから返されるタイプはすべて基本タイプ(文字列、intなど)になります。配列を返すものがいくつかありますが、私はそれらに対して常に別のことを行うことができます。これは決して優先度の高い問題ではありませんが、見るたびにイライラします。これを行うにはもっと良い方法があるはずだと思います。

最初のステップは、さまざまなメソッドの名前を変更することだと思います。2番目のパラメーターのデフォルトに渡されるタイプによって異なるため、少なくとも同じ名前に強制することができます。しかし、私はそれよりもうまくやれるでしょうか?使用されているデータ型(すべての数値のTryParse)の点でのみ異なる、各メソッドの反復コードの複数のビットを取り除くことができれば素晴らしいと思います。

4

3 に答える 3

3

根性がそれほど複雑でなければ、一般的な方法で逃げることができるかもしれないと思います。たとえば、次のようなものかもしれません。

public T GetValue<T>(string name, T ifNull) where T : IConvertible
{
    string value = GetProperty(name);
    if (value == null)
        return ifNull;
    try
    {
        return (T)Convert.ChangeType(value, typeof(T));
    }
    catch
    {
        return ifNull;
    }
}

GetArrayValue配列の場合、別のことを行う関数が必要になる場合があります。

于 2012-06-06T20:20:07.407 に答える
2

default(T)タイプのデフォルト値を取得するために使用できます。

public T Get<T>(string propertyName)
{
    object obj;
    if (propertyBag.TryGetValue(propertyName, out obj)) {
        return (T)obj;
    }
    if(typeof(T) == typeof(string)) {
        return String.Empty;
    }
    return default(T);
}

アップデート

別の方法として、明示的なデフォルト値を受け入れる 2 つのオーバーロードを用意することもできます。

public T Get<T>(string propertyName)
{
    return Get<T>(propertyName, default(T));
}

public T Get<T>(string propertyName, T defaultValue)
{
    object obj;
    if (propertyBag.TryGetValue(propertyName, out obj)) {
        return (T)obj;
    }
    return defaultValue;
}
于 2012-06-06T20:14:31.477 に答える
1

.netジェネリックの優れている点は、それらがどのパラメーターを表すかが明確な場合に、暗黙的に使用できることです。その文の文法についてはよくわかりませんが、それをたくさん使うことで可能になることは間違いありません。

たとえば、GetValueの場合:

 public T GetValue<T>(string PropertyName, T DefaultValue)
 {

 }

 .... return GetValue("Prop1", 4); //T = int
 .....return GetValue("Prop2", string.Empty) //T= string
 //for nullable times, you can always include the generic parameter
 GetValue<int[]>("Prop3",null);
 //or by 'strongly typing' the null value:
 GetValue("Prop3", (int[])null); //for set this isn't a problem, since 'value' already is strongly typed

設定も同じ

public void SetValue<T>(string PropertyName, T Value)
{
}
于 2012-06-06T20:18:17.803 に答える