Tag: reflection

通过reflection区分类属性类型

我有一个Rectangle类 public class Rectangle : Base, IRectangle { public IDimension dimension { get; set; } public Position position { get; set; } public String color { get; set; } public int ID { get; set; } public override String ToString() { return base.ToString(this); } } 有没有办法区分Rectangle类中定义的reflection类型的属性? 我怎样才能理解ID是结构还是维度是接口? String和Position都是类,但String是在类中构建的,Position是Custom类。

通过reflection确定派生类

我想处理从类A派生的类的方法。类A和派生类驻留在不同的程序集中。 我使用reflection从派生的程序集中获取所有System.Type并迭代它们的方法。 Assembly A: class Template {…} Assembly B: class X: A.Template {…} Assembly B: class Y: A.Template {…} Assembly B: class Z: A.Template {…} 当我尝试在程序集B迭代类X的方法时,它包含了类A所有方法。 我想要实现的只是遍历派生类中存在的那些方法。 我认为在不同的程序集中根本不重要,但即使我尝试根据程序集过滤方法的声明类型,它也不起作用。 我已经尝试使用MethodInfo对象的各种属性,但无法过滤掉它。 我确信我错过了一些愚蠢的检查,但一直在努力解决这个问题。 任何意见,将不胜感激。

如何检查类型是否标有属性?

它需要反思吗?

ILMerge替代方案,如何在EXE文件中嵌入应用程序的相关DLL?

正如这里所说的,我试图在exe应用程序中嵌入dll以便只分发一个exe,但是当我尝试在安装了完整.NET 4的xp机器上运行我的应用程序时它只是崩溃而没有错误,我放置以下内容主方法的代码 [STAThread] static void Main() { AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { String resourceName = “AssemblyLoadingAndReflection.” + new AssemblyName(args.Name).Name + “.dll”; using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) { Byte[] assemblyData = new Byte[stream.Length]; stream.Read(assemblyData, 0, assemblyData.Length); return Assembly.Load(assemblyData); } }; Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new frmrPrincipal()); } 我有一个名为dlls的文件夹,我放置 Functions.Shared.dll Alex.UI.dll Alex.Controls.dll 并将我的Build Action设置为“Embedded Resource”。 如果我删除那段代码并通过单击一次安装程序设置要包含的dll它工作正常。 顺便说一句使用.NET Framework […]

无法获取PropertyInfo.SetValue()来设置我的对象上的值

我已将下面的代码简化为一个基本示例,但我仍然无法获取要设置的值。 执行propertyInfo.SetValue()时,它将在我的Contact对象的setter上命中断点,并在’setter’中正确设置该值。 但是,在执行SetValue()之后,projectContact.Contact对象上的字符串属性尚未更改为“a”。 知道我在这里做错了什么吗? IEnumerable contacts = GetContactsByProject(projectId); foreach (ProjectContact projectContact in contacts) { foreach (PropertyInfo propertyInfo in projectContact.Contact.GetType().GetProperties()) { if (propertyInfo.PropertyType == typeof(string)) { propertyInfo.SetValue(projectContact.Contact, “a”, null); } } }

X是一个变量,但在尝试投射时使用的类似

我传递了一个我要查询的实体类型名称的字符串,并根据字符串获取类型。 我想让DbSet返回并返回IQueryable 。 问题是我在做什么(DbSet)并得到以下错误: tableEntity是一个变量,但像类型一样使用 当试图施放。 有办法解决这个问题吗? public object GetList(string tableEntity) { Type tableEntity = Type.GetType(“TestProject.” + typeName + “, TestProject”); var dbObject = (DbSet)typeof(DbContext).GetMethod(“Set”, Type.EmptyTypes) .MakeGenericMethod(tableEntity) .Invoke(databaseContext, null); return dbObject.AsQueryable(); } 编辑 只是要添加我无法访问我们通过字符串传递名称的类型。

获取实现某个抽象类的所有类

我正在尝试获取实现某个抽象类的所有类。 我正在尝试使用以下代码执行此操作: var type = typeof(BaseViewComponent); var types = Assembly .GetEntryAssembly() .GetReferencedAssemblies() .Select(Assembly.Load) .SelectMany(s => s.GetTypes()) .Where(p => type.IsAssignableFrom(p)); 但到目前为止,我只能自己获得抽象类。 不是任何实现该基类的类。 我需要更改什么才能获得实现此抽象基类的所有类?

C#是具有generics类型约束的generics类型

让我们假设一个界面 interface IOwnedBy where T : IOwner { T Owner { get; } } 和 interface IOwner { public int Id { get; } } 在我的代码的某处,我想做以下事情: if (obj is OwnedBy) { DoSomethingWith( obj.Owner.Id ); } 基本上,我想检查obj是否是任何OwnedBy实现。 由于IOwner是任何generics参数的类型约束,我认为这个可行。 但这种情况从未得到满足。 没有使用很多reflection的任何方式?

C#隐式转换“重载”和reflection问题

我有以下代码的问题(编译但崩溃): using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; namespace ConsoleApplication1 { public struct MyBoolean { public bool Value { get; set; } //cast string -> MyBoolean public static implicit operator MyBoolean(System.String value) { return new MyBoolean() { Value = (value[0] == ‘J’) }; } //cast bool -> MyBoolean public static implicit operator […]

如何区分generics类中具有相同名称和参数数量的两种方法?

这是我的class级: public class MyClass { public void MyMethod(T a) { } public void MyMethod(int a) { } } 即使int是MyClass的generics类型参数,我如何使用Reflection Invoke MyMethod(T) ? 这是一个单一的声明(可能效率低下,但我喜欢简洁): var mc = new MyClass(); typeof(MyClass).GetMethods().ElementAt( typeof(MyClass). GetGenericTypeDefinition(). GetMethods().ToList().FindIndex(m => m.Name.Equals(“MyMethod”) && m.GetParameters().Count() == 1 && m.GetParameters()[0].ParameterType.IsGenericParameter) ).Invoke(mc, new object[] { 1 });