2009-06-18 41 views
1

セッター/ゲッター関数からどのようにEnumを返すのですか?現在戻り値Enumから関数C#

私はこれを持っている:

小文字は「タイプ」ですが、

どれを「変数」のように使用されています。私はこれを実行しようとすると

public enum LowerCase 
    { 
     a, 
     b, 
    } 
    public enum UpperCase 
    { 
     A, 
     B, 
    } 

    public enum Case 
    { 
     Upper, 
     Lower, 
    } 

    private Enum _Case; 
    private Enum _ChosenCase; 


    public Enum ChooseCase 
    { 
     get 
     { 
      if ('Condition') 
      { 
       return LowerCase; //[need to return LowerCase] 
      } 
      else 
      { 
       return UpperCase; //[need to return UpperCase] 
      } 
     } 
     set 
     { 
      _ChosenCase = value; 
     } 
    } 

私はエラーを取得します列挙型を返すために何をする必要があるのか​​?

また、現時点で値を設定しているかどうかもわかりません。

誰かが一般的なアドバイスをいただけたら、私はそれを感謝します。ほとんどの人は私が何をしようとしているのかを見ることができます。

ありがとうございました。

[最新の編集]

まずはお返事いただいたすべての方に感謝します。明確ではないあなたのせい:)

これはコードIである - この質問を簡素化する試みにおいて

、私が大文字/小文字の間違ったアナロジーを使用していると、あなたのいくつかは間違った考えを持って表示されますこれまで持っていて、VisualStudioをでhappsens何ChoiceOneとChoiceTwo

public partial class CustomControl1 : Control 
    { 
    public enum ChoiceOne 
    { 
     SubChoiceA, 
     SubChoiceB, 
    } 
    public enum ChoiceTwo 
    { 
     SubChoiceC, 
     SubChoiceD, 
    } 
    public enum Choice 
    { 
     ChoiceOne, 
     ChoiceTwo, 
    } 

    private Type _subChoice; 
    private Choice _choice; 

    public Type SetSubChoice 
    { 
     get 
     { 
      if (_choice.Equals(Choice.ChoiceOne)) 
      { 
       return typeof(ChoiceOne); 
      } 
      else 
      { 
       return typeof(ChoiceTwo); 
      } 
     } 
     set 
     { 
      _subChoice = value; 
     } 
    } 

    public Choice SetChoice 
    { 
     get 
     { 
      return _choice; 
     } 
     set 
     { 
      _choice = value; 
     } 
    }  
    } 

の間で選択することを可能にするには、プロパティグリッドは、あなたが正しいChoiceOneとChoiceTwo間SetChoiceプロパティを設定することを可能にするということです。

問題は、SetSubChoiceプロパティがグレー表示されているが、SetChoiceの設定に応じて 'WindowsFormsApplication4.CustomControl1 + ChoiceOne'または 'WindowsFormsApplication4.CustomControl1 + ChoiceTwo'のいずれかに設定されるという問題があります。私が欲しいのは、SetChoiceを使用して、SetChoiceの設定に応じてSubChoiceAまたはSubChoiceBまたはSubChoiceCまたはSubChoiceDを選択できるようにすることです。

たとえば、SetChoiceがChoiceOneに設定されている場合、SetSubChoiceによってChoiceAまたはChoiceBのいずれかを選択できます。 同様に、SetChoiceがChoiceTwoに設定されている場合、SetSubChoiceによってChoiceCまたはChoiceDのいずれかを選択できます。

これでもう少し明確になっていることを願っていますか?

私たちは今ほとんど存在しています。

ありがとうございました

+0

あなたはタイプを返すことができません – BlackTigerX

+1

"この男がやっていることは分かっています"と知っている時間があれば、これは便利だと思います... – Hugoware

答えて

3

エラーは正しいです。これは基本的にこれと同じです。

public int ChooseCase 
{ 
    get{ return int; } 
} 

あなたがしたいことは、共通のベースを持つenumsではなく、実際のクラスを使用することです。

public abstract class Case 
{ 
    public abstract string ModifyString(string value); 
} 

public class UpperCase : Case 
{ 
    public override string ModifyString(string value) 
    { 
     return String.ToUpper(value); 
    } 
} 
12

あなたが望むように見えます:

public Case ChooseCase 
{ 
    get { return 'Condition' ? Case.Lower : Case.Upper; } 
} 

または私は完全にポイントを逃したがありますか?小文字がタイプであるため、エラーがスローされ

+1

私にとっては、何らかの "ベースクラス"列挙型。彼は、LowerCaseとUpperCaseは両方ともEnumから派生したものだと考えています。列挙型のポリモーフィズムを使うこと。 – tanascius

+0

ただし、LowerCaseとUpperCaseは両方ともEnumから派生しています。 –

+0

はい、私はそれを非常にひどく説明しました。彼は "新しいLowerCase();を返すことさえできますが、彼が望むやり方では助けになりません。私は彼が "var enum = ChooseCase;"をしたいと思います"enum"と考えています。場合によってはインテリセンスA/Bまたはa/bを表示します。それは動作していません。 – tanascius

0

使用タイプ...つまり...

 

public Type ChooseCase{ 
    get{ return typeof(Uppercase); } 
} 
 
0

。あなたがこのステートメントを書こうとしていたとしたらどうでしょうか?

return Int32; 

Int32は型であり変数ではないため、動作しません。 LowerCaseのインスタンスを作成し、それを返す必要があります。

2

あなたは2つの列挙型を混在させていますが、それは良い考えではありません。列挙型の目的を破るからです。

間違いなくを実行してください。 intにキャストして比較します。これにより、将来のバージョンで列挙値の順序を変更できなくなります。

2

私はあなたが列挙を使用する理由を誤解しているかもしれないと思います。列挙型は、特定の値の集合しか取ることのできない特別な型の変数です。例えば。ブール値は列挙の非常に特殊なケースです。ブール変数は、2つの値(「true」または「false」のいずれか)しか取ることができない変数です。

あなたが列挙を定義している:

public enum LowerCase 
    { 
     a, 
     b, 
    }

これはタイプLowerCaseの変数はいずれか一方のみ、またはbに設定することができるようになることを意味します。これはあまり役に立ちません。

他の列挙体がより賢明です:

public enum Case 
    { 
     Upper, 
     Lower, 
    }
Case型の変数は、 "Upper"または "Lower"のいずれかに設定できます。ここで、列挙型の変数を定義するときに、その型を指定します。あなたはこれを実行しました:
private Enum case;
しかし、どういう意味でしょう:
private Case case;
Case caseと呼ばれるプライベート変数が定義されています。 enumキーワードは、列挙型の変数を定義するときではなく、新しい列挙を定義するときにのみ使用されます。

あなたがあなたの財産を定義している。同様に

、あなたが戻りたい列挙型を使用する必要があります

public Case ChooseCase 
{...
をそして、あなたが列挙値を返すようにしようとしているところを、あなたはこれをやっている必要があります。おそらくあなたを
return Case.Lower

0

彼らはすべてのEnumから正確に導き出すため

abstract class Case 
{ 
    abstract char GetItem(int index); 
} 

class LowerCase : Case 
{ 
    override char GetItem(int index) 
    { 
     // Not sure for the following 
     Encoding ascii = Encoding.ASCII; 
     return ascii.GetString(ascii.GetBytes("a")[0] + index)[0]; 
    } 
} 

class UpperCase : Case 
{ 
    // The same for the upper case 
} 

public Case ChooseCase 
{ 
    get 
    { 
     if (condition) 
     { 
      return new LowerCase(); 
     } 
     else 
     { 
      return new UpperCase(); 
     } 
    } 
} 

これは、あなたが列挙型で行うことができないものである:あなたのChooseCaseプロパティは、対応するクラスのオブジェクトを返すように、基本クラスのケースと2つの派生クラスを使用する必要があります。