是否可以确定动态成员访问期望的类型?我试过了
dynamic foo = new MyDynamicObject();
int x = foo.IntValue;
int y = (int)foo.IntValue;
Run Code Online (Sandbox Code Playgroud)
并且TryGetMember拦截GetMemberBinder.ReturnType是对象的任何一种方式.我还想TryConvert知道是否可以调用它来进行转换,但它永远不会被命中.
是否有一些其他覆盖我缺少让我确定调用者想要什么类型,以便我可以进行适当的转换?
我还在尝试使用DynamicObjects.现在我需要一些信息:我正在尝试将从DynamicObject继承的对象绑定到WPF DataGrid(而不是Silverlight).
如何让DataGrid从通常在运行时生成的对象的可用公共属性中自动创建其列?这可能吗?
我成功地使用MVC3中的JavaScriptSerializer将json字符串反序列化为动态对象.我无法弄清楚的是如何将它投射到我可以列举的东西上.下面的foreach代码行是我最新的attemt,但它错误:"无法将类型'System.Dynamic.DynamicObject'隐式转换为'System.Collections.IEnumerable'.如何转换或转换以便我可以遍历字典?
public dynamic GetEntities(string entityName, string entityField)
{
var serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new[] { new MyProject.Extensions.JsonExtension.DynamicJsonConverter() });
dynamic data = serializer.Deserialize(json, typeof(object));
return data;
}
foreach (var author in GetEntities("author", "lastname"))
Run Code Online (Sandbox Code Playgroud) 这是一个DynamicDataObject派生自的类DynamicObject
public class DynamicDataObject : DynamicObject
{
private readonly Dictionary<string, object> _dataDictionary = new Dictionary<string, object>();
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
return _dataDictionary.TryGetValue(binder.Name, out result);
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
if (!_dataDictionary.ContainsKey(binder.Name))
{
_dataDictionary.Add(binder.Name, value);
return true;
}
return false;
}
public override IEnumerable<string> GetDynamicMemberNames()
{
return _dataDictionary.Keys;
}
}
Run Code Online (Sandbox Code Playgroud)
我正在消费DynamicDataObject如下.
public MainWindow()
{
InitializeComponent();
dynamic person = new DynamicDataObject();
person.FirstName = "Vimal";
person.LastName = "Adams";
person.Address …Run Code Online (Sandbox Code Playgroud) 假设我不能使用ExpandoObject并且必须像我这样自己滚动: -
class MyObject : DynamicObject {
dictionary<string, object> _properties = dictionary<string, object>();
public override bool TryGetMember(GetMemberBinder binder, out object result) {
string name = binder.Name.ToLower();
return _properties.TryGetValue(name, out result);
}
public override bool TrySetMember(SetMemberBinder binder, object value) {
_properties[binder.Name.ToLower()] = value;
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
并进一步向下我的类层次结构
class MyNewObject : MyObject {
public string Name {
get {
// do some funky stuff
}
set {
// ditto
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是非常好的,因为现在我可以做到以下几点: -
dynamic o = MyNewObject();
o.Age = 87; …Run Code Online (Sandbox Code Playgroud) 我正在尝试从System.Web.Helpers.DynamicJsonObject读取值.我可以看到调试器中的值,但我无法弄清楚如何访问它们.我试过这个
item.GetType().GetProperty("batch_id").GetValue(item, null);
但是当我尝试在调试器中得到这个响应"item.GetType().GetProperty("batch_id")'为null"
我附上了我的解决方案中的图片

谢谢,-Tesh
这是一个非常具体的问题.不太确定如何说出来.基本上我正在实现工作单元和存储库模式,我有一个动态对象,我转换为int,但如果我使用var它将在尝试调用方法时抛出异常.
我试图删除所有这些问题,我可以解决这个问题.出于某种原因,我只看到这两种设计模式.我得到的例外是Additional information: 'BlackMagic.ITacoRepo' does not contain a definition for 'DoStuff'
这是代码:
class BlackMagic
{
static void Main(string[] args)
{
dynamic obj = new ExpandoObject();
obj.I = 69;
UnitOfWork uow = new UnitOfWork();
int i1 = Convert.ToInt32(obj.I);
var i2 = Convert.ToInt32(obj.I);
if(i1.Equals(i2))
{
uow.TacoRepo.DoStuff(i1); // Works fine
uow.TacoRepo.DoStuff(i2); // Throws Exception
}
}
}
class UnitOfWork
{
public ITacoRepo TacoRepo { get; set; }
public UnitOfWork()
{
TacoRepo = new TacoRepo();
}
}
class Repo<T> : IRepo<T> …Run Code Online (Sandbox Code Playgroud) c# unit-of-work repository-pattern expandoobject dynamicobject
我有一个动态对象(实际上是json),我将其传递给我的MVC WebApi控制器.
json对象包含匿名对象中的多个列表,这些列表通过另一个应用程序提交给控制器client.PostAsJsonAsync("myapiurl", objectGraph).
我需要做的就是在MVC端验证对象,就是获取每个列表中对象的数量.我可以通过动态访问列表mydynamicobject.mylist和单个项目,mydynamicobject.mylist[index]但我似乎无法得到计数mydynamicobject.mylist.
到目前为止我尝试过的:
Enumerable.Count(mydynamicobject.mylist) - 不能推断类型还有其他想法吗?计数实际上在动态对象中是正确可用的,base但显然不能作为属性访问.救命!
这现在有效:
// This is a MVC/WebApi method
public dynamic Post(dynamic mydynamicobject)
if (((ICollection)mydynamicobject.mylist).Count == 0)
{
// do something
}
Run Code Online (Sandbox Code Playgroud)
发送动态对象的代码(不同的应用程序):
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add
(new MediaTypeWithQualityHeaderValue("application/json"));
var objectGraph = new { mylist = new { Id = 1 }, mylist2 = new { Name = "ABC" } };
var r = client.PostAsJsonAsync("api/mycontroller", objectGraph).Result;
Run Code Online (Sandbox Code Playgroud) 我试图序列化一个继承自DynamicObject的类的实例.我已经毫不费力地将动态属性序列化了(为简洁起见,这里没有演示),但"正常"属性似乎并没有成功.无论序列化类如何,我都会遇到同样的问题:它与JavaScriptSerializer,JsonConvert和XmlSerializer相同.
public class MyDynamicClass : DynamicObject
{
public string MyNormalProperty { get; set; }
}
...
MyDynamicClass instance = new MyDynamicClass()
{
MyNormalProperty = "Hello, world!"
};
string json = JsonConvert.SerializeObject(instance);
// the resulting string is "{}", but I expected to see MyNormalProperty in there
Run Code Online (Sandbox Code Playgroud)
MyNormalProperty不应该出现在序列化字符串中吗?有没有诀窍,或者我误解了从DynamicObject继承的一些基本原理?
考虑我有这个简单的c#代码:
dynamic obj = new ExpandoObject();
obj.FirstName = "John";
obj.LastName = "Doe";
Run Code Online (Sandbox Code Playgroud)
John Doe在这种情况下,我想添加将返回全名的方法.我知道以下行会起作用,但不确定它是否是最好的方法
obj.GetFullName = new Func<string>(() => $"{obj.FirstName} {obj.LastName}");
Run Code Online (Sandbox Code Playgroud)
有没有其他方法dynamic object通过该GetFullName方法访问实例?
dynamicobject ×10
c# ×9
asp.net-mvc ×2
dynamic ×2
.net ×1
c#-4.0 ×1
data-binding ×1
datagrid ×1
json ×1
json.net ×1
linq ×1
unit-of-work ×1
wpf ×1