13

Type を静的フィールドに格納して、次のようなことができるようにするにはどうすればよいですか (注: 疑似コードでの単なる例です)?:

public class Logger
{
    public static Type Writer;

    public static void SetWriter(Type @new)
    {
        Writer = @new;
    }

    public static void Write(string str)
    {
        Writer.Write(str);
    }
}
4

3 に答える 3

30

非常に簡単です:

Type variableName = typeof(SomeTypeName);

また

Type variableName = someObject.GetType();

ただし、これが実際にやりたいことに役立つかどうかはわかりません。他の回答を参照してください。

于 2012-07-17T00:50:08.537 に答える
3

キーワードであるという事実を除いてnew、型を格納するコードは正常に機能するはずです。

ただし、コード

Writer.Write(str);

無意味です。

クラスTypeにメソッドがありませんWrite(string)

あなたが求めているのはインターフェイスのように感じます

public interface IWriter
{
    public Write(string text);
}

public class Logger
{
    public static IWriter Writer;

    public static void SetWriter(IWriter newWriter)
    {
        Writer = newWriter;
    }

    public static void Write(string str)
    {
        Writer.Write(str);
    }
}

そうすれば、実装するクラスを に渡すことができますIWriterSetWriter

public class MyWriter : IWriter
{
    public void Write(string text)
    {
        // Do something to "write" text
    }
}

Logger.SetWriter(new MyWriter());
于 2012-07-17T00:48:10.253 に答える
0

そのサンプル コードは意味がありませんが、単純に共通のインターフェイスを使用しないのはなぜでしょうか? たとえば、System.IO名前空間内のテキスト書き込み型のすべて (少なくともすべてだと思います) は、抽象クラスから継承されるTextWriterため、...

例えば:

public class Logger
{
    public Logger(TextWriter writer)
    {
        _writer = writer;
    }

    private TextWriter _writer;    

    public void Write(string text)
    {
        _writer.Write(text);
    }
}

では、ライターを公開し、コードのユーザーに依存してコードが常に有効であることを確認するのは良い考えでしょうか? おそらくそうではありませんが、それは設計上の考慮事項です。また、あなたのJavaスタイルセッターは、A)プロパティの構文サポートが優れているC#には非典型的であり、B)とにかくバッキングフィールドが公開されているため役に立たない.

于 2012-07-17T00:48:50.787 に答える