gpt4 book ai didi

c# - 只有通用参数时调用静态成员

转载 作者:太空宇宙 更新时间:2023-11-03 11:53:06 27 4
gpt4 key购买 nike

当我只有一个泛型参数时,有什么方法可以调用类型上的静态成员。例如,如果我有这样的东西

public Get<T>(int id)
{
// I would like to do this
string s = T.SomeMethodName();
}

我可以这样做,但有点“讨厌”,然后不管它是否是静态的都没有关系。或者我可以按照 Yuriy 的建议使用反射。

ISomeKnownInterface i = (ISomeKnownInterface ) new T(); 
string s = i.SomeMethodName();

所以现在的问题是哪种方法更好,创建使用反射的新实例

public TFormDto Get<TFormDto>(int entityId) where TFormDto : AbstractEntityFormDto, new()
{
// create new instance
AbstractEntityFormDto a = (AbstractEntityFormDto) new TFormDto();
string entityName = a.GetEntityFullTypeName();

// use reflection

Type type = typeof(TFormDto);
string entityName = type.GetMethods(BindingFlags.Public | BindingFlags.Static)
.Single(m => m.Name == "GetEntityFullTypeName")
.Invoke(null, null);

最佳答案

那不会总是 AbstractBaseClass.GetFullName()。否则你必须在 T 上使用反射来获取另一个类的静态方法。 This可能会有帮助。

下面是一个简单的例子:

class TestClass
{
public static void Hello()
{

Console.WriteLine("World!!!");
}
}

public static void Test<T>() where T : class
{
Type type = typeof(T);
type.GetMethods(BindingFlags.Public | BindingFlags.Static)
.Single(m => m.Name == "Hello")
.Invoke(null, null);

}

对于您的示例,我假设您知道接口(interface)没有静态方法。我假设您的意思是您有一个接口(interface),该接口(interface)具有静态方法的签名,而实现该接口(interface)的类只会从实现中调用静态方法。这也可以,但您不能保证会调用正确的静态并确保 T 对该接口(interface)有约束,而不仅仅是 new()。

关于c# - 只有通用参数时调用静态成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1534869/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com