相关疑难解决方法(0)

动态添加属性到ExpandoObject

我想在运行时动态地向ExpandoObject添加属性.所以例如添加一个字符串属性调用NewProp我想写类似的东西

var x = new ExpandoObject();
x.AddProperty("NewProp", System.String);
Run Code Online (Sandbox Code Playgroud)

这很容易吗?

c# dynamic expandoobject c#-4.0

215
推荐指数
3
解决办法
10万
查看次数

如何在C#中拦截方法调用?

对于给定的类,我希望有跟踪功能,即我想记录每个方法调用(方法签名和实际参数值)和每个方法退出(只是方法签名).

我如何做到这一点假设:

  • 我不想为C#使用任何第三方AOP库,
  • 我不想将重复的代码添加到我想要跟踪的所有方法中,
  • 我不想更改类的公共API - 类的用户应该能够以完全相同的方式调用所有方法.

为了使问题更具体,让我们假设有3个类:

 public class Caller 
 {
     public static void Call() 
     {
         Traced traced = new Traced();
         traced.Method1();
         traced.Method2(); 
     }
 }

 public class Traced 
 {
     public void Method1(String name, Int32 value) { }

     public void Method2(Object object) { }
 }

 public class Logger
 {
     public static void LogStart(MethodInfo method, Object[] parameterValues);

     public static void LogEnd(MethodInfo method);
 }
Run Code Online (Sandbox Code Playgroud)

如何调用Logger.LogStartLogger.LogEnd每次调用方法1方法2,而无需修改Caller.Call方法,没有明确地加入调用Traced.Method1Traced.Method2

编辑:如果我允许稍微更改Call方法,会有什么解决方案?

c# reflection aop

148
推荐指数
7
解决办法
8万
查看次数

Reflection.Emit与CodeDOM

使用Reflection.Emit库与CodeDOM在运行时动态生成代码有什么优缺点?

我试图在基于XML格式运行时可用元数据的系统中生成一些(相对复杂的)动态类.我将生成扩展应用程序集中现有类的类,实现其他接口,添加方法以及覆盖虚拟和抽象成员.

我想确保在深入实现之前选择适当的技术.有关这些不同代码生成技术如何不同的任何信息都会有所帮助.此外,任何有关简化或简化工作的开源库的信息都将是有用的.

.net c# code-generation codedom reflection.emit

50
推荐指数
3
解决办法
1万
查看次数

如何创建LINQ表达式树以选择匿名类型

我想使用表达式树动态生成以下select语句:

var v = from c in Countries
        where c.City == "London"
        select new {c.Name, c.Population};
Run Code Online (Sandbox Code Playgroud)

我已经研究出如何生成

var v = from c in Countries
        where c.City == "London"
        select new {c.Name};
Run Code Online (Sandbox Code Playgroud)

但我似乎无法找到一个构造函数/重载,让我在select lambda中指定多个属性.

c# linq linq-to-entities entity-framework expression-trees

45
推荐指数
3
解决办法
3万
查看次数

C# - 如何检查C#中是否存在名称空间,类或方法?

我有一个C#程序,如果存在名称空间,类或方法,我如何在运行时检查?另外,如何使用字符串形式的名称实例化一个类?

伪代码:

string @namespace = "MyNameSpace";
string @class = "MyClass";
string method= "MyMEthod";

var y = IsNamespaceExists(namespace);
var x = IsClassExists(@class)? new @class : null; //Check if exists, instantiate if so.
var z = x.IsMethodExists(method);
Run Code Online (Sandbox Code Playgroud)

c# methods namespaces class

37
推荐指数
2
解决办法
4万
查看次数

如何在.NET Core中发出类型

在C#中,如何在运行时使用.NET Core发出新的Type?我可以在.NET 6中找到的所有示例似乎都不适用于.NET内核(它们都是从获取当前AppDomain开始的,而后者在.NET内核中不再存在).

如果可能的话,我将会感谢一个涉及创建Type并向Type添加属性的示例.

c# reflection.emit system.reflection

30
推荐指数
1
解决办法
9961
查看次数

有没有办法在运行时构建一个新类型?

我会问一个听起来很奇怪的问题.

有没有办法在运行时构建一个新类?或者至少,向现有类添加新属性.

我的意思是创建一个不存在的类,而不是现有类的实例.我以后可以使用反射来加载和使用这个类.

.net c# vb.net reflection

20
推荐指数
3
解决办法
9865
查看次数

动态创建新的PropertyInfo对象

这是我的第一篇文章,尽管我在某种程度上搜索了与我的问题相关的主题,但我在找到正确的答案时遇到了很多麻烦.

我的问题可能很简单,但我知道答案可能不那么容易.如果存在的话.

话虽如此,这是我的情况:作为一个例子,我有一个PropertyInfo对象数组,我用它来从类中获取属性,如下所示:

public PropertyInfo[] GetProperties (object o)
{
    PropertyInfo[] properties = o.GetType().GetProperties();

    return properties;
}
Run Code Online (Sandbox Code Playgroud)

看起来很简单吧?现在我的问题是:如何创建一个新的PropertyInfo对象并将其添加到数组?

我看过其他帖子,用户想要设置PropertyInfo的VALUE,但这不是我需要的.我需要的是动态创建一个新的PropertyInfo对象,其中我唯一可用的数据是NameType.

我之前发布的测试用例只是我想要实现的一个小例子.事实上,我真正的最终目标是能够基于这个类创建一个新的PropertyInfo:

public class DynamicClass
{
    public Type ObjectType { get; set; }
    public List<string> PropertyNameList { get; set; }
    public List<Type> PropertyTypeList { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我希望有人可以帮助我实现这一目标.提前谢谢了!

编辑:我忘了在GetProperties()方法之前添加o.GetType().谢谢Ilya Ivanov!

我正在调用SelectProperties方法,如下所示:

list = _queriable.Select(SelectProperties).ToList();
Run Code Online (Sandbox Code Playgroud)

该方法如下所示:

private Expression<Func<T, List<string>>> SelectProperties
{
    get
    {
       return value => _properties.Select
                      (
                          prop => (prop.GetValue(value, new object[0]) ?? string.Empty).ToString()
                      ).ToList();
        } …
Run Code Online (Sandbox Code Playgroud)

c# reflection object propertyinfo

9
推荐指数
2
解决办法
1万
查看次数

忽略/覆盖AttributeUsage限制

我需要能够应用于DisplayAttribute类,但它AttributeUsage不允许在当前的.NET/.NET Core版本中.看起来这已经针对.NET Core vNext进行了补救,但如果有一些解决方法能够以某种方式忽略或覆盖此限制,直到此更改进入.NET版本非常有用.我能看到的唯一选择是重新实现整个事情(包括本地化),但我真的不想支持和测试,只要在.NET vNext发布时就弃用它.

任何聪明的想法/黑客?

在CLR运行时是否验证了AttributeUsage限制,还是只是编译时间限制?如果它们只是编译时间检查,那么是否有一种聪明的方法来更改编译器使用的元数据"欺骗"它允许使用或以某种方式修改系统程序集,以便我的开发机器允许使用?

*我似乎无法编辑赏金说明,只是为了澄清,赏金的解决方案必须适用于.NET Framework,以及.NET Core的奖励积分.

.net c# custom-attributes .net-core

8
推荐指数
1
解决办法
235
查看次数

C# 动态构建匿名对象

在 C# 中,我可以在编译时轻松创建这样的匿名对象:

var items = new {
 Price = 2000,
 Description = "",
 Locations = new List<string> { "", "" }  
};
Run Code Online (Sandbox Code Playgroud)

我的问题是,可以在运行时创建这个对象吗?我听说过发射/元编程,但我不知道它在这里是否有帮助。

请注意,这些对象将在 for 循环(100 项或更多)内创建,因此我推荐允许类型缓存的技术。

谢谢。

更新 - 为什么我需要这个

  • 一个例子可能是实现Include类似 in的功能db.Users.Include("Users"),所以我需要Users在运行时按需添加属性。

c# reflection reflection.emit dynamic anonymous-types

7
推荐指数
1
解决办法
1677
查看次数