2016-07-27 10 views
0

限定された範囲の「拡張子」を許可するコンストラクタ呼び出しが必要です。別の開発者は、彼が唯一そうのようなExtensionクラスからの値で行うことができますFooを使用したい場合は、だから、他のクラスの定数値を持つコンストラクタを呼び出す

public class Foo 
{ 
    public Foo(Extension ext) 
    { 
     // do something 
    } 
} 

public class Extension 
{ 
    public const string TXT = ".txt"; 
    public const string XML = ".xml"; 
} 

::のは、私はこれらの2つのクラスがあるとしましょう

Foo foo = new Foo(Extension.TXT); 

しかししようこれを行うには、私はIDEエラーを言って:"cannot convert from 'string' to '<ProjectName>.Extension'を取得します。

public class Extension 
{ 
    public enum File 
    { 
     TXT, 
     XML 
    } 
} 

をし、このようにそれを使用します:「回避策」として

私はこのような何かに私のExtensionクラスを変更する可能性が完全に正常に動作しますが、私は好きではない何

Foo foo = new Foo(Extension.File.TXT); 

呼び出しが1レベル長く(class - > elementの代わりにclass - > enum - > element)あることです。

実際の唯一の有効な解決策は、私の回避策ですか?

+3

は、クラスからNUMを削除し、それを作りますパブリック。 enum: 'new Foo(File.Txt);だけを呼び出します。 –

答えて

5
を解除しないのはなぜ

あなたは

public class Extension 
{ 
    string _Extension = null; 

    private Extension(string ext) 
    { 
     _Extension = ext; 
    } 

    public static Extension TXT 
    { 
     get { return new Extension(".txt"); } 
    } 

    public static Extension XML 
    { 
     get { return new Extension(".xml"); } 
    } 

    public override string ToString() 
    { 
     return _Extension; 
    } 

    public override bool Equals(object obj) 
    { 
     var e = obj as Extension; 
     if (e == null) return false; 

     return e._Extension == this._Extension; 
    } 

    public override int GetHashCode() 
    { 
     return _Extension.GetHashCode(); 
    } 
} 
3

最初の例では、2つの文字列定数を持つクラスとしてExtensionが使用されています。 2番目の例では、定数の代わりに列挙型を使用しています。それはExtensionの種類ではなく、文字列を期待しているように動作しません上記.ctorに文字列を渡すしよう

public class Foo 
{ 
    // this .ctor expects a type of Extension, not a string. 
    public Foo(Extension ext) 
    { 
     // do something 
    } 
} 

// This class has only constant string values. 
public class Extension 
{ 
    public const string TXT = ".txt"; 
    public const string XML = ".xml"; 
} 

。その後、

// this passes in a string, not a type. 
Foo foo = new Foo(Extension.TXT); 

あなたはFoo .ctorに使用可能な値を制限するために欠けているとして、あなたはあなたの第二の例を持っているとして列挙型を使用します。

public class Foo 
{ 
    public Foo(File ext) 
    { 
     // do something 
    } 
} 

public enum File 
{ 
    TXT, 
    XML 
} 

予想通り、これは動作します:

Foo foo = new Foo(File.TXT); 
0

文字列のデフォルトコンストラクタと暗黙の演算子をExtensionに定義できます。例えば。あなたはFooの( "TXT")を呼び出すことができます方法

public class Extension 
{ 
    public const string TXT = ".txt"; 
    public const string XML = ".xml"; 

    private _value; 
    public Extension(string value){if(value == TXT || value == XML) _value = value; else throw new NotImplementedException();} 
    public static implicit operator string(Extension value){return _value;} 
    public static implicit operator Extension(string value){if(value == TXT || value == XML) _value = value; else throw new NotImplementedException();} 
} 

かはFoo(Extension.TXT)

またはあなたが拡張のインスタンスとしてTXTを定義することができます::のようなもの

public class Extension 
{ 
    public const Extension TXT = new Extension(".txt"); 
    public const Extension XML = new Extension(".xml"); 

    public Value{get;private set;} 
    public Extension(string value){Value = value;} 
} 
1

のJavaスタイル列挙クラスを使用することができますクラスFooの外でclare列挙型で、拡張のような特別なクラスはありませんか?

public enum Extension 
{ 
    TXT, 
    XML 
} 

public class Foo 
{ 
    public Foo(Extension ext) 
    { 
     // do something 
    } 
} 

その後、あなたはFooのオブジェクトを構築しているときには、単純に行うことができます。

Foo foo = new Foo(Extension.TXT); 
0

だけクラスから列挙

にExtesionの最初の宣言を変更
関連する問題