我想在运行时动态地向ExpandoObject添加属性.所以例如添加一个字符串属性调用NewProp我想写类似的东西
var x = new ExpandoObject();
x.AddProperty("NewProp", System.String);
Run Code Online (Sandbox Code Playgroud)
这很容易吗?
对于给定的类,我希望有跟踪功能,即我想记录每个方法调用(方法签名和实际参数值)和每个方法退出(只是方法签名).
我如何做到这一点假设:
为了使问题更具体,让我们假设有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.LogStart和Logger.LogEnd每次调用方法1和方法2,而无需修改Caller.Call方法,没有明确地加入调用Traced.Method1和Traced.Method2?
编辑:如果我允许稍微更改Call方法,会有什么解决方案?
使用Reflection.Emit库与CodeDOM在运行时动态生成代码有什么优缺点?
我试图在基于XML格式运行时可用元数据的系统中生成一些(相对复杂的)动态类.我将生成扩展应用程序集中现有类的类,实现其他接口,添加方法以及覆盖虚拟和抽象成员.
我想确保在深入实现之前选择适当的技术.有关这些不同代码生成技术如何不同的任何信息都会有所帮助.此外,任何有关简化或简化工作的开源库的信息都将是有用的.
我想使用表达式树动态生成以下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#程序,如果存在名称空间,类或方法,我如何在运行时检查?另外,如何使用字符串形式的名称实例化一个类?
伪代码:
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#中,如何在运行时使用.NET Core发出新的Type?我可以在.NET 6中找到的所有示例似乎都不适用于.NET内核(它们都是从获取当前AppDomain开始的,而后者在.NET内核中不再存在).
如果可能的话,我将会感谢一个涉及创建Type并向Type添加属性的示例.
我会问一个听起来很奇怪的问题.
有没有办法在运行时构建一个新类?或者至少,向现有类添加新属性.
我的意思是创建一个不存在的类,而不是现有类的实例.我以后可以使用反射来加载和使用这个类.
这是我的第一篇文章,尽管我在某种程度上搜索了与我的问题相关的主题,但我在找到正确的答案时遇到了很多麻烦.
我的问题可能很简单,但我知道答案可能不那么容易.如果存在的话.
话虽如此,这是我的情况:作为一个例子,我有一个PropertyInfo对象数组,我用它来从类中获取属性,如下所示:
public PropertyInfo[] GetProperties (object o)
{
PropertyInfo[] properties = o.GetType().GetProperties();
return properties;
}
Run Code Online (Sandbox Code Playgroud)
看起来很简单吧?现在我的问题是:如何创建一个新的PropertyInfo对象并将其添加到数组?
我看过其他帖子,用户想要设置PropertyInfo的VALUE,但这不是我需要的.我需要的是动态创建一个新的PropertyInfo对象,其中我唯一可用的数据是Name和Type.
我之前发布的测试用例只是我想要实现的一个小例子.事实上,我真正的最终目标是能够基于这个类创建一个新的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) 我需要能够应用于DisplayAttribute类,但它AttributeUsage不允许在当前的.NET/.NET Core版本中.看起来这已经针对.NET Core vNext进行了补救,但如果有一些解决方法能够以某种方式忽略或覆盖此限制,直到此更改进入.NET版本非常有用.我能看到的唯一选择是重新实现整个事情(包括本地化),但我真的不想支持和测试,只要在.NET vNext发布时就弃用它.
任何聪明的想法/黑客?
在CLR运行时是否验证了AttributeUsage限制,还是只是编译时间限制?如果它们只是编译时间检查,那么是否有一种聪明的方法来更改编译器使用的元数据"欺骗"它允许使用或以某种方式修改系统程序集,以便我的开发机器允许使用?
*我似乎无法编辑赏金说明,只是为了澄清,赏金的解决方案必须适用于.NET Framework,以及.NET Core的奖励积分.
在 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# ×10
reflection ×4
.net ×3
dynamic ×2
.net-core ×1
aop ×1
c#-4.0 ×1
class ×1
codedom ×1
linq ×1
methods ×1
namespaces ×1
object ×1
propertyinfo ×1
vb.net ×1