我应该在C#中使用泛型参数还是类型参数?

我应该在C#中使用泛型参数还是类型参数?,c#,generics,types,C#,Generics,Types,我只想将参数传递到方法中用于日志记录。参数是我将要处理的事件类型。我可以看到两种方法,我想知道这两种方法是否更正确 private void LogEventProcessing<T>() { _logger.Information($"Started processing of {typeof(T).Name} event"); } 使用类型参数更简洁,我不同意在这个问题上放置关闭标志,原因是在所描述的场景中,第一个是更好的选择 您可以使用类型约束来约束客户端插入的参数的

我只想将参数传递到方法中用于日志记录。参数是我将要处理的事件类型。我可以看到两种方法,我想知道这两种方法是否更正确

private void LogEventProcessing<T>()
{
    _logger.Information($"Started processing of {typeof(T).Name} event");
}

使用
类型
参数更简洁,我不同意在这个问题上放置关闭标志,原因是在所描述的场景中,第一个是更好的选择

您可以使用
类型约束
来约束客户端插入的参数的
类型

private void LogEventProcessing<T>() where T : Event
{
    _logger.Information($"Started processing of {typeof(T).Name} event");
}
private void LogEventProcessing(),其中T:Event
{
_logger.Information($“已开始处理{typeof(T.Name}事件”);
}

上面的方法现在只接受从类型
事件继承的类,它更干净,并且让客户端清楚地知道您在这里期望的是什么。

使用
类型
参数更干净,我不同意在这个问题上放置关闭标志,原因是,在所描述的场景中,第一个是更好的选择

您可以使用
类型约束
来约束客户端插入的参数的
类型

private void LogEventProcessing<T>() where T : Event
{
    _logger.Information($"Started processing of {typeof(T).Name} event");
}
private void LogEventProcessing(),其中T:Event
{
_logger.Information($“已开始处理{typeof(T.Name}事件”);
}

上面的方法现在只接受从类型
事件继承的类,它更干净,并且让客户端清楚地知道您在这里期望的是什么。

我不喜欢这两个选项中的任何一个。作为客户端,您必须调用泛型版本,或者在将事件传递给日志函数之前,必须调用事件的
GetType()
。这似乎是因为您的客户机与日志功能的工作联系太紧密了。如果要记录有关事件的更多信息,会发生什么?您是否创建了一个新方法并仅传递该信息?或者,您是否返回对此方法的每个引用并添加一个新参数


恶心,不管怎样,恶心。我的建议是:两者都不要做。传递事件,然后在方法本身中从它获取所需的内容

这两个选项我都不喜欢。作为客户端,您必须调用泛型版本,或者在将事件传递给日志函数之前,必须调用事件的
GetType()
。这似乎是因为您的客户机与日志功能的工作联系太紧密了。如果要记录有关事件的更多信息,会发生什么?您是否创建了一个新方法并仅传递该信息?或者,您是否返回对此方法的每个引用并添加一个新参数


恶心,不管怎样,恶心。我的建议是:两者都不要做。传递事件,然后在方法本身中从它获取所需的内容

两者都会起作用,因此两者都是“正确的”。无论哪一个“更好”,都是一个意见问题。只要你对类型名称感兴趣,就选择适合你的。第一个可能对你更合适,因为这样你就不必每次都记得通过类型。您只需调用日志函数。@TylerMarshall类型仍需传入,因为它无法隐式确定。没有类型为
T
的参数。OP不能简单地调用
LogEventProcessing()
@Amy,哦,你说得对。我认为这是一种延伸。然后你可以使用typeof self,而不需要调用方传递它。两者都可以工作,所以都是“正确的”。无论哪一个“更好”,都是一个意见问题。只要你对类型名称感兴趣,就选择适合你的。第一个可能对你更合适,因为这样你就不必每次都记得通过类型。您只需调用日志函数。@TylerMarshall类型仍需传入,因为它无法隐式确定。没有类型为
T
的参数。OP不能简单地调用
LogEventProcessing()
@Amy,哦,你说得对。我认为这是一种延伸。然后您可以使用typeof self,而不需要调用方传递它。