2

私はこれについて多くの同様のトピックを見つけましたが、私の質問に直接答えるものではありません。いろいろなタイプの部屋を配置するゲームを作っています。部屋のクラスがあり、次にこれを継承するいくつかの部屋があります。たとえば、寝室、食堂などです。

各部屋には、その属性を設定するための特定の静的パラメーターがあります。例えば:

public class Room : WorldEntity
{
    public static string Name = "Room";
    public static uint MinHeight = 0;
    public static uint MinWidth = 0;
    //...
}

public class Bedroom : Room
{
    new public static string Name = "Bedroom";
    new public static uint MinHeight = 4;
    new public static uint MinWidth = 4;  
     //...
}

部屋を作成するとき、私は最初に必要な部屋のタイプを通過します。

public static void PlaceRoom(Type T){//begin room creation process}

私が知りたいのは、PlaceRoom関数内からTの属性を取得するにはどうすればよいですか?たとえば、T.MinHeight(Tが寝室タイプの場合は4を返します)を取得するにはどうすればよいですか?それとも、これについてもっと良い方法がありますか?

クラスT(T:Room)を初期化するつもりはなかったので、メンバーは静的であり、ジェネリックを使用しようとしています。

4

3 に答える 3

3

1つのオプションは、IRoomこれらの値をプロパティとして定義するインターフェイスを作成することです。各クラスはこれらのプロパティを実装し、ハードコードされた結果を返します。

もう1つのオプションは、1つ以上の属性を作成し、それらをクラスに適用することです。このPlaceRoom関数は、リフレクションを使用して属性を読み取ります。

于 2012-12-05T19:47:28.053 に答える
1

まず最初に、非常に悪い設計であるパブリック静的フィールドを作成しました。パブリック静的フィールドは読み取り専用である必要があります。静的フィールド/プロパティを仮想化することはできず、PlaceRoomを呼び出す前にインスタンスを作成したくないため、属性を使用してタイプに注釈を付けることができます。

class Program
{
    static void Main(string[] args)
    {
        PlaceRoom<Room>();
        Console.ReadKey(true);
    }

    public static void PlaceRoom<T>()
        where T : Room
    {
        string name = ((NameAttribute)typeof(T).GetCustomAttributes(false).First(x => x is NameAttribute)).Name;

        Console.WriteLine(name);
    }
}

[Name("Room")]
public class Room
{
}

[Name("Bedroom")]
public class Bedroom : Room
{
}

[AttributeUsage(AttributeTargets.Class, Inherited = false)]
public class NameAttribute : Attribute
{
    public string Name { get; set; }

    public NameAttribute(string name)
    {
        Name = name;
    }
}
于 2012-12-05T21:11:21.573 に答える
0

プロパティを常にオーバーライド(または新規作成)していて、実際に実際のRoom型を配置しない場合は、Roomとそのすべてのプロパティの両方を抽象化してから、メソッドのシグネチャpublic static void PlaceRoom<T>(T room) where T : Roomを適切にジェネリックにすることができます。次に、寝室、バスルームなどを部屋から継承します。

新しいプロパティを追加する場合、実際には一般的ではないものについて一般的ではないため、これは論理的に欠陥があります。

于 2012-12-05T20:17:10.760 に答える