Mat*_* M. 12 c# dynamic dynamic-keyword
我想写类似以下内容:
// I will pass in a number of "properties" specified as strings that I want modified
string[] properties = new [] { "AllowEdit", "AllowDelete" };
// Casting the component I'm using to a dynamic object of some sort ?
dynamic d = myGridComponent;
// Iterate over the strings and set the properties
foreach(var s in properties)
{
//d.s = true; //
//d[s] = true; // this format would be ideal
}
Run Code Online (Sandbox Code Playgroud)
我在想,如果有一个简单的方法来做到这一点,而无需使用反射[ .GetProperty(...).GetValue(...,...)使用新的C#4.0关键字]: dynamic.
似乎可能有某种方式,......我只是不确定确切的机制,并且无法找到合适的资源来将所有部分组合在一起.
想法?
[编辑]看起来有一个名为"Clay"的包以某种方式实现了这种类型的功能.
关于主题的CodePlex Scott Hanselman的粘土
可以办到.你只需要重写TryGetIndex的DynamicObject.我需要类似的东西来调用类型的静态成员,但希望你能得到这个想法.请注意,这当前不适用于具有泛型类型参数的方法或过载的方法,从而限制了它的实用程序:
internal class StaticMembersDynamicWrapper : DynamicObject
{
private readonly IDictionary<String, MemberInfo> staticMembers = new Dictionary<string, MemberInfo>();
private readonly Type type;
public StaticMembersDynamicWrapper(Type type)
{
this.type = type;
type.GetMembers(BindingFlags.FlattenHierarchy | BindingFlags.Static | BindingFlags.Public)
.Each(member => staticMembers[member.Name] = member);
}
public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
{
var name = indexes[0] as string;
MemberInfo member;
if (false == staticMembers.TryGetValue(name, out member))
{
result = null;
return false;
}
var prop = member as PropertyInfo;
if (prop != null)
{
result = prop.GetValue(null, null);
return true;
}
var method = member as MethodInfo;
if (method != null)
{
var parameterTypes = (from p in method.GetParameters()
select p.ParameterType).ToArray();
var delegateType = method.ReturnType != typeof (void)
? Expression.GetFuncType(parameterTypes.Union(new[]{method.ReturnType}).ToArray())
: Expression.GetActionType(parameterTypes);
result = Delegate.CreateDelegate(delegateType, method);
return true;
}
result = null;
return false;
}
}
dynamic d = new StaticMembersDynamicWrapper(typeof(string));
var result = d["IsNullOrEmpty"](String.Empty);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4527 次 |
| 最近记录: |