【问题标题】:C# generics: Can you convert <T> ToString?C# 泛型:你能转换 <T> ToString 吗?
【发布时间】:2013-09-28 23:11:13
【问题描述】:

这里快点~ 我想把 ToString 转换成那个类型的变量~

public void ChangePanel<T>(T Action){

    FieldInfo Field = T.GetField(T.toString);
    Field.SetValue(SomeObject, Action);
}

如果有更好的方法,请告诉我!

编辑:仅供参考 SomeObject 中的变量与类型具有相同的名称

【问题讨论】:

  • 不清楚你想要达到什么目的
  • T.toString?也许试试 T.ToString()
  • 是的,应该可以的
  • T 是一个类型,而不是一个对象
  • 这个方法是为了改变我的静态(ActionPanel)类,无论我给它什么Action我都想替换(ActionPanel)单例中的对应变量~

标签: c# variables generics types field


【解决方案1】:

您可以使用typeof Keyword 获取Type 实例,并使用Type.Name Property 获取类型名称。

public void ChangePanel<T>(T action)
{
    Type typeOfObject = someObject.GetType();
    Type typeOfAction = typeof(T);

    FieldInfo field = typeOfObject.GetField(typeOfAction.Name);
    field.SetValue(someObject, action);
}

【讨论】:

  • 谢谢先生!虽然我不能只删除泛型并只使用“Action.GetType().Name”吗??
【解决方案2】:

是的。 ToString() 是在 object 类上定义的,所有东西都派生自该类,所以我希望您可以在任何类型 T 上调用它。但是,您需要在参数本身而不是类型上调用它,因此您应该使用Action.ToString() 而不是T.ToString()。如果要获取类型的名称,则应使用反射而不是 ToString

此外,反射选项是;

 typeof(T).Name

 Action.GetType().Name

【讨论】:

  • @Silvermind T 是一个类型参数。这不是实例,如果我说带有重载的ToString() 方法的Person 类返回了在T 上调用ToString() 的人的名字和姓氏,则不会产生返回第一个和姓,我必须在 Valamas 所说的实例上调用它。 T 实际上是一种类型。 C# 中的泛型要求您在 &lt;&gt; 符号中指定类型(在某些情况下实际上可以推断,但这是基本思想)。
【解决方案3】:

如果你想得到一个泛型类型的名字,那么你可以直接调用typeof(T).Name

public static string GetGenericTypeName<T>()
{
    return typeof(T).Name;
}

【讨论】:

    【解决方案4】:

    ToString方法是一个方法,所以需要括号来调用它,并且大小写对于标识符很重要:

    FieldInfo Field = (typeof T).GetField(Action.ToString());
    

    GetFieldType 类的一个方法,因此您需要typeof 来获取T 泛型类型的Type 对象。

    【讨论】:

      猜你喜欢
      • 2018-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多