14

初めてインターフェイスをクラスに実装するときは、resharper6またはVisualStudio 2010のいずれかで、プロパティを自動実装プロパティとして実装し、デフォルト値のthrow new NonImplementedException();を入れないようにします。これどうやってするの?例えば:

public interface IEmployee
{
// want this to stay just like this when  implemented into class
ID { get; set; }
}

public class Employee : IEmployee
{
// I do not want the throw new NonImplemented exception
// I want it to just appear as an auto implemented property
// as I defined it in the interface
public int ID
        {
            get
            {
                throw new NotImplementedException();
            }
            set
            {
                throw new NotImplementedException();
            }
        }
}

これは常に発生するため、新しいUnImplimented()例外をスローするものを常にリファクタリングして手動で削除し、プロパティを手動で自動実装する必要があることに気付きました...苦痛です!結局のところ、私はそれを自分のインターフェースで自動実装されたプロパティとして定義しました。

どんな助けやアドバイスも大歓迎です!ありがとう。

4

7 に答える 7

7

結局のところ、私はそれを自分のインターフェースで自動実装されたプロパティとして定義しました。

いいえ、しませんでした。実装なしのプロパティとして宣言しました。インターフェイスでできることはこれだけです。インターフェイスを実装するクラスは、そのようなプロパティの具体的な実装を提供する必要があると言っているだけです。

個人的には、インターフェイス内に書き込み可能なプロパティが多すぎることに注意します。これが「常に発生する」場合は、抽象クラスの方が適切なインターフェイスを使用しているかどうか疑問に思います。

あなたの正確な質問に関して:VSまたはR#がインターフェースに提供するデフォルトの実装を変更することが可能かどうかはわかりませんが、正直なところ、これらの変更を行うことには抵抗します。

編集:R#オプションの[コード生成]で、例外をスローするか、デフォルト値を返すか、コンパイルできないコードを指定するかを選択できます。これであなたが望むことをする可能性があります。試してみてください。ただし、この道を進む前に、慎重に検討することを強くお勧めします。

于 2012-04-29T12:55:58.020 に答える
7

注:R#キーボードショートカットは異なる場合があります。私はResharper2.xキーボードスキーマを使用しています。

クラスでインターフェースを宣言してからAlt+を使用Enterし、「メンバーの実装」を選択した場合:

「Implementmebers」を選択する"></ p> <p>次に、デフォルトの実装を取得します。これを変更しない限り、たまたま<code> NotImplementedException</code>がスローされます。</p><p>提案された一連のアクションを無視し、代わりに<kbd> Alt </ kbd> + <kbd> Insert </ kbd>を使用して[Generate]メニューを開き、[Missingmembers]を選択できます。</ p> <p> <img src =

それはあなたが望むことを正確に行います:

class Employee : IEmployee
{
    public int Id { get; set; }
}
于 2012-04-29T14:40:09.227 に答える
3

インターフェイスは、メソッドの実装方法を指定するためのものではないため、インターフェイスを使用して回避する方法はありません。1つの解決策は、インターフェイスを直接実装する代わりに、自動実装されたプロパティを使用して抽象基本クラスを作成し、そのクラスを継承することです。

于 2012-04-29T12:57:02.627 に答える
3

これがVS2015で見つけた簡単な回避策です。クラスを抽象としてマークしてから、インターフェースを抽象的に実装します。これにより、自動プロパティが追加され、ファイル内の「abstract」を「」に置き換えるだけです。次に、クラスからabstractキーワードを削除できます。

于 2016-06-12T13:21:34.850 に答える
1

VS2015の場合、回避策として検索と置換のマクロを使用しています。

Find:
(\r|\n| |\t)+\{(\r|\n| |\t)+get(\r|\n| |\t)+\{(\r|\n| |\t)+throw(\r|\n| |\t)+new(\r|\n| |\t)+NotImplementedException\(\);(\r|\n| |\t)+\}(\r|\n| |\t)+set(\r|\n| |\t)+\{(\r|\n| |\t)+throw(\r|\n| |\t)+new(\r|\n| |\t)+NotImplementedException\(\);(\r|\n| |\t)+\}(\r|\n| |\t)+\}

replace:
 {get;set;}
于 2017-01-27T06:38:46.393 に答える
0

Jonの答えに加えて、Visual Studioのこの(すぐに使用できる)動作を変更し、インターフェイスを実装するときに自動プロパティを作成する場合は、次のいずれかを試すことができます...

  1. コード生成にT4を使用する-http ://msdn.microsoft.com/en-us/library/bb126445.aspx

  2. VSSDKを使用してVisualStudioのカスタムプラグインを作成し、これを実現します

于 2012-04-29T13:01:44.910 に答える
0

この質問とは完全には関係ありませんが、インターフェイスにそのようなプロパティが複数ある場合は、インターフェイスの代わりにクラスを作成して、そのクラスをメインクラスの戻り型として参照することもできます。クラスを作成し、メインクラスでそのクラスを参照できます。例

public class Asset
{
    public int AssetTrackingID { get; set; }

    public Category AssetCategoryInfo { get; set; }

    public Manufacturer AssetManufacturerInfo { get; set; }

    public ManufacturerModel AssetModelInfo { get; set; }

    public Status AssetStatusInfo { get; set; }

    public EmployeeDetails AssetEmployeeInfo { get; set; }

    public string AssetNumber { get; set; }

    public string SerialNumber { get; set; }

    public DateTime? AcquiredDate { get; set; }

}

于 2015-12-30T18:35:48.737 に答える