6

私はしばらくの間疑問に思っていました.C#では、クラス内のいくつかのプロパティの「テンプレート」を定義する方法があります. これが私が言いたいことです:私が次のクラスを持っていると仮定しましょう

class MyCLass
{
    public int  IntVal1 { get {...}; set{...} }
    public byte IntVal2 { get {...}; set{...} }
    ....
    public long IntValN { get {...}; set{...} }
}

get アクセサーと set アクセサーに特定の実装を記述しませんでしたが、これらのプロパティはすべて非常によく似た実装を持っているという考えです。似ている。

私の考えは、いくつかのパラメーターを使用して、ある種の(それを呼びましょう)「テンプレート」を定義する方法を見つけることです。おそらく、これらのすべてのプロパティを宣言するために使用される可能性があり、それらのすべての実際の実装を記述する必要はありません-多分属性を使って!?!

私が必要としているのは、C マクロに似ていると思います。

10倍前払い

4

4 に答える 4

3

簡単に言えば「いいえ」ですが、繰り返しを減らすためにできることがあります。たとえば、次のことを考慮してください。

private bool SetField<T>(ref T field, T value,
    [CallerMemberName] string memberName = null)
{
    if (!EqualityComparer<T>.Default.Equals(field, value))
    {
        field = value;
        var handler = PropertyChanged;
        if (handler != null) handler(this,
            new PropertyChangedEventArgs(memberName));
        return true;
    }
    return false;
}

これは、次のような方法でオーバーヘッドを削減するために使用できます。

private string bar;
public string Bar
{
    get { return bar; }
    set { SetField(ref bar, value); }
}
于 2013-03-08T09:59:22.193 に答える
1

はい、私の理解が正しければ、C# ではこれに Generics を使用します。

class MyCLass<T>
{
    public T Val { get {...}; set{...} }
}

T「テンプレート化」するタイプを定義します。

そして、次のようにクラスを使用します。

var myClassInt = new MyClass<int>();
myClassInt.Val // is an integer
于 2013-03-08T09:57:02.423 に答える
1

T4 templatesそこからコードを生成して確認することができます: http://msdn.microsoft.com/en-us/library/vstudio/bb126445.aspx

部分クラスを使用する場合、1 つを生成コードに使用し、もう 1 つを非生成コードに使用できます。

ここに素晴らしいチュートリアルがあります: http://t4-editor.tangible-engineering.com/How-Do-I-With-T4-Editor-Text-Templates.html

于 2013-03-08T09:57:12.797 に答える
0

基本クラスに仮想保護メソッドが必要です。このメソッドはプロパティを設定します。子クラスでは、基本実装を継承するか、Init/Set/Get メソッドをオーバーライドしてカスタム実装を作成できます。

abstract class BaseMyClass
{
    public BaseMyClass(arg1, arg2,...)
    {
        Init(arg1, arg2,...);
    }

    public int  IntVal1 { get {...}; set{...} }
    public byte IntVal2 { get {...}; set{...} }
    public byte IntVal3 
    { 
        get 
        {
            return GetIntVal3(); 
        } 
        set
        {
            SetIntVal3(value);
        }
    }

    protected void virtual Init(arg1, arg2,...)
    {
         //Init properties
    }

    protected virtual byte GetIntVal3()
    {
         //Implementation
    }

    protected virtual void SetIntVal3(value)
    {
         //Implementation
    }
}

class MyCLass : BaseMyClass
{
    public MyCLass(arg1, arg2, ...): base(arg1, arg2,...)
}

class AnotherMyCLass : BaseMyClass
{
    public MyCLass(arg1, arg2, ...): base(arg1, arg2,...)

    protected override void Init(arg1, arg2,...)
    {
         //Init properties
    }
}
于 2013-03-08T10:10:30.463 に答える