如何将className传递给c#中获得泛型类型作为参数的方法
本文关键字:泛型类型 参数 方法 className | 更新日期: 2023-09-27 18:18:33
我有很多类反映我的屏幕库从白色/UIAutomation。要使用repository,我需要创建许多类来反映应用程序窗口的屏幕。
使用以下方法创建存储库:
var repoReport = repository.Get<MyClassRepresentingWindow>("WindowTitle",
InitializeOption.WithCache);
传递一个泛型类型,该类型是Class I准备的。
我想做的是创建一个字典(stringClassName, string windowTitle)或任何映射传递给那个方法。问题是不能像Java ClassForName一样传递className。
我试过System.Activator
,但没有成功。
Object configObj = System.Activator.CreateInstance(c);
Type c = System.Type.GetType("Namespace.MyClassRepresentingWIndow");
var myClass = System.Reflection.Assembly.GetExecutingAssembly().CreateInstance("Namespace.MyClassRepresentingWIndow");
Type type = assembly.GetType("Namespace.MyClassRepresentingWIndow");
object obj = Activator.CreateInstance(type);
var repoReport = repository.Get<c>("WindowTitle",
InitializeOption.WithCache);
var repoReport = repository.Get<c.Name>("WindowTitle",
InitializeOption.WithCache);
Update1 伙计们,我不会坐在代码前面,但我会尽量让我的问题不那么复杂。
这是我在White仓库中发现的一个方法,我想我使用它:https://github.com/petmongrels/white/blob/itemsmap/Components/Repository/Source/ScreenRepository.cs
public virtual T Get<T>(string title, InitializeOption option) where T : AppScreen
{
ClearClosedScreens();
AppScreen screen;
var repositoryCacheKey = new ScreenRepositoryCacheKey(title, typeof (T));
if (!screenCache.TryGetValue(repositoryCacheKey, out screen))
{
Window window = applicationSession.Application.GetWindow(title, IdentifiedOption<T>(option));
screen = GetScreen<T>(window);
screenCache.Add(repositoryCacheKey, screen);
}
if (screen != null)
sessionReport.Next(typeof (T));
return (T) screen;
}
我记得VS将。get显示为。get <"类"类型>。对不起,我不能更好地表达自己。请耐心听我说,因为我对这个术语不熟悉。
更新2
最后我想得到这样的东西:
var repoReport1 = repository.Get<MyClassRepresentingWindow1>("WindowTitle", InitializeOption.WithCache);
var repoReport1 = repository.Get<MyClassRepresentingWindow2>("WindowTitle", InitializeOption.WithCache);
var repoReport1 = repository.Get<MyClassRepresentingWindow3>("WindowTitle", InitializeOption.WithCache);
,我有一个代码MyClassRepresentingWindow{1,2,3}
。我只是不知道如何传递类名给Get方法。在输入时,我有这个类的字符串名。在输出上,我想传递一些.Get<T>
方法可以得到的东西。我希望你现在能理解我。
为了使用仅在运行时才知道值的变量类型参数来调用它,您需要使用反射。我假设您知道如何获得表示存储库的Get<T>
方法的MethodInfo
。
一旦你有了这个,这个例子说明了如何使用MethodInfo对象的基本思想。这个例子假设repository
类被称为Repo
;根据需要修改:
object InvokeGenericMethod(Repo repository, MethodInfo method, Type typeArg, string arg1, InitializeOption arg2)
{
MethodInfo constructedMethod = method.MakeGenericMethod(typeArg);
return constructedMethod.Invoke(repository, new object[] { arg1, arg2 });
}
当然,您可以把它写得更通用一些,但那样会使示例不那么清晰。
我相信你想要的是这样的:
public string GetName<T>()
{
return typeof(T).Name;
}
这会导致以下单元测试通过("Basic Math"只是我在我的临时应用程序中放置的一个类型):
[TestMethod]
public void Test_Of_Generic_Type_Name()
{
var myBuilder = new GenericNamer();
Assert.AreEqual<string>("BasicMath", myBuilder.GetName<BasicMath>());
}
也可以使用类型的全名、程序集等。下面是关于使用反射可以从Type类中提取什么的更多信息:
http://msdn.microsoft.com/en-us/library/system.type.aspx