13

如何将类型存储在静态字段中,以便我可以做这样的事情(注意:只是一个例子,在伪代码中)?:

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命名空间中的所有(至少我认为是所有)文本书写类型都继承自 abstract class 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 回答