如何将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>方法可以得到的东西。我希望你现在能理解我。

如何将className传递给c#中获得泛型类型作为参数的方法

为了使用仅在运行时才知道值的变量类型参数来调用它,您需要使用反射。我假设您知道如何获得表示存储库的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