Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用T调用类型包含在字符串中的方法_C#_C# 4.0_Reflection - Fatal编程技术网

C# 使用T调用类型包含在字符串中的方法

C# 使用T调用类型包含在字符串中的方法,c#,c#-4.0,reflection,C#,C# 4.0,Reflection,我有一个方法,在该方法中,对象的类型提前知道,并且需要将该对象(及其类型)传递到一个方法中,例如: public void foo() { string type_of_object = "person"; person p = new person(); // insert code here } public T method<T>(object obj) { // some functions go here return (T)... } publi

我有一个方法,在该方法中,对象的类型提前知道,并且需要将该对象(及其类型)传递到一个方法中,例如:

public void foo()
{
  string type_of_object = "person";
  person p = new person();

  // insert code here
}

public T method<T>(object obj)
{
  // some functions go here
  return (T)...
}
public void foo()
{
字符串类型为\u object=“person”;
人员p=新人员();
//在这里插入代码
}
公共T方法(对象obj)
{
//这里有一些函数
返回(T)。。。
}
考虑到可能有数百种类型需要处理,我不想对每种类型都使用switch语句。我似乎不知道如何按照这些思路做一些事情:

var foo = method<person.GetType()>(p);
var foo=方法(p);

有人吗?

我认为反射库应该对此有所帮助。反射可能会很慢,但如果在程序开始时,您为类型创建一个字符串字典,则可以加快反射速度

var dict = Assembly.GetExecutingAssembly().GetTypes().ToDictionary(t => t.Name, t => t);
然后,在您自己的代码中:

Type targetType;
if (!dict.TryGet(type_of_object, out targetType)) {
  // log error with unknown type
}
我是在答题箱里写的,不是编辑,所以如果我遗漏了一些简单的东西,我表示歉意。我也不完全确定我对你的“某些功能”有什么想法。
此外,我的代码对使用相同名称在不同名称空间中的多个类型也不做任何说明。你可能会想,如果你做的不仅仅是“string,in 32……”/p>< p>你可以使用反射。在您的情况下,将类似于:

MethodInfo method = this.GetType().GetMethod("method");
MethodInfo generic = method.MakeGenericMethod(p.GetType());
generic.Invoke(this, p);

检查此响应:

我意识到有时事情可能会超出您的控制范围,但为什么首先需要这样做?泛型参数必须是编译时常量,无论是推断的还是显式的。不能提供类型值,必须实际提供类型名称。基本上,你不能按照你的要求去做。这个特定应用程序的后半部分是通用的。我们正试图增加通用代码的数量。有一个switch语句列出了每种类型,并且在每种情况下都有完全相同的代码块(当然类型发生了变化),但问题是类型的数量将增长到非常非常大。Cheers我不把它算作“nice”:如果参数的类型与返回类型相同,您可以将您的方法声明为
publictmethod(tobj)
,并简单地像
var foo=method(p)那样调用它
。我认为你的
人物
应该是
p.GetType()
typeof(人物)
-尝试使用问题中的名称。那么,p.GetType()将返回正确的类型@haxor GetType将获取对象的类型,而不是变量。如果它下面仍然是
person
,则它是否由
对象
变量指向并不重要。GetType()返回对象的运行时类,因此即使person存储在对象变量中,也将获得正确的类型。然后,您可以使用type.GetType(“yournamespace.person”)获得正确的类型。在method.MakeGenericMethod(Type.GetType(“yournamespace.person”))中使用它;