如何将类型而不是实例传递给 C# 中的函数?

发布于 2024-10-19 07:41:48 字数 248 浏览 1 评论 0原文

我尝试使用反射来枚举类字段和方法,以便在 Web 应用程序中实现一些自动化。我也将其抽象化,以便我可以通过任何课程。

有没有一种方法可以将类型直接传递给要枚举的函数而不是类型的实例?

我希望调用方看起来像这样:

var m = new MyClass(AClassOfSomeTypeIDefined);

我想避免创建实例,因为这会误导任何可能使用该类的人(因为该实例不直接使用)。

I am attempting to use reflection to enumerate class fields and methods in order to do some automation in a web application. I am also abstracting this so that I could pass in any class.

Is there a way I could somehow pass in the type directly to a function to enumerate on rather than an instance of the type?

I would like the caller side to look like this:

var m = new MyClass(AClassOfSomeTypeIDefined);

I would like to avoid creating an instance as that is misleading to anyone who might use the class (as the instance isn't directly used).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

赢得她心 2024-10-26 07:41:48
using System;

public void UseType(Type t) {
    // do something with t using reflection techniques - e.g.
    Console.WriteLine("compat with int? {0}", typeof(int).IsAssignableFrom(t));
}

使用 C# typeof 关键字和要传递的数据类型。

// Examples...
UseType( typeof(int) );
UseType( typeof(System.Int32) );
UseType( typeof(System.Windows.Controls.Button) );
UseType( typeof(IDisposable) );
UseType( typeof(WhateverTypeYouWant) );

正如您所知,System.Type 是反射的基石之一,因此请使用它来运行。


其他说明
根据您想要对该类型执行的操作,以下外围设备详细信息可能有用。

要在运行时创建 Type 实例而不在编译时使用 new 关键字,请使用 System.Activator 类。例如

// Create a List of strings like: new List<string>();
var list = (List<string>) Activator.CreateInstance( typeof(List<string>) );
using System;

public void UseType(Type t) {
    // do something with t using reflection techniques - e.g.
    Console.WriteLine("compat with int? {0}", typeof(int).IsAssignableFrom(t));
}

Call it with C# typeof keyword and the data type you want to pass.

// Examples...
UseType( typeof(int) );
UseType( typeof(System.Int32) );
UseType( typeof(System.Windows.Controls.Button) );
UseType( typeof(IDisposable) );
UseType( typeof(WhateverTypeYouWant) );

System.Type is one of the cornerstones of reflection as you already know, so run with it.


Other notes
Depending on what you want to do with the type, the following peripheral details might be useful.

To create an instance of a Type at runtime without having used the new keyword at compile time, use the System.Activator class. e.g.

// Create a List of strings like: new List<string>();
var list = (List<string>) Activator.CreateInstance( typeof(List<string>) );
ζ澈沫 2024-10-26 07:41:48

是的,只需使用 Type你的班级。获取类型有两种基本方法:

Foo foo = new Foo();
Type myType = foo.GetType();
Type myTyp2 = typeof(Foo);

如果您只在运行时知道类型(在反射中更常见),则可以使用 GetType();如果您知道类型,则可以使用 typeof()在编译时就已经知道类型了。

在你的例子中,这将是

var m = new MyClass(typeof(Foo));

yes just use the Type of your class. There's two basic ways to get the type:

Foo foo = new Foo();
Type myType = foo.GetType();
Type myTyp2 = typeof(Foo);

You can use GetType() if you only know the type at runtime (more common with reflection), or typeof() if you know the type at compile time already.

In your example this would be i.e.

var m = new MyClass(typeof(Foo));
青瓷清茶倾城歌 2024-10-26 07:41:48

您可以像传递任何其他参数一样传递 Type 对象。

class MyClass
{
    public MyClass(Type yourType)
    {
        // do as you please with yourType
    }
}

称其为:

var m = new MyClass(typeof(YourType));

You can pass a Type object just like any other parameter.

class MyClass
{
    public MyClass(Type yourType)
    {
        // do as you please with yourType
    }
}

The call it:

var m = new MyClass(typeof(YourType));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文