namespace ConsoleApplication
{
using System;
using System.Linq;
using Microshaoft;
using Test.Share;
public class Class1
{
//[STAThread]
static void Main(string[] args)
{
var c = "Test.Share.ComplexType";
var assembly = AppDomain.CurrentDomain.GetAssemblies().First
(
(a) =>
{
return a.GetTypes().Any
(
(t) =>
{
return (t.FullName == c);
}
);
}
);
ComplexType.F2 = "01234";
var o = new ComplexType();
o.F1 = "56789";
var typeName = o.GetType().FullName;
//=======================================================================================
var getter1 = DynamicPropertyAccessor.CreateGetStaticPropertyValueFunc(typeName, "f2");
var v1 = getter1();
Console.WriteLine(v1);
//=======================================================================================
var getter2 = DynamicPropertyAccessor.CreateGetStaticPropertyValueFunc<string>(typeName, "f2");
string v2 = getter2();
Console.WriteLine(v2);
//=======================================================================================
var getter3 = DynamicPropertyAccessor.CreateGetPropertyValueFunc(typeName, "f1");
var v3 = getter3(o);
Console.WriteLine(v3);
//=======================================================================================
var getter4 = DynamicPropertyAccessor.CreateGetPropertyValueFunc<string>(typeName, "f1");
var v4 = getter4(o);
Console.WriteLine(v4);
//=======================================================================================
var setter1 = DynamicPropertyAccessor.CreateSetStaticPropertyValueAction(typeName, "f2");
setter1("ABCD");
v1 = getter1();
Console.WriteLine(v1);
v2 = getter2();
Console.WriteLine(v2);
//=======================================================================================
var setter2 = DynamicPropertyAccessor.CreateSetStaticPropertyValueAction<string>(typeName, "f2");
setter2("EFFGH");
v1 = getter1();
Console.WriteLine(v1);
v2 = getter2();
Console.WriteLine(v2);
//=======================================================================================
var setter3 = DynamicPropertyAccessor.CreateSetPropertyValueAction(typeName, "f1");
setter3(o, "IJKL");
v3 = getter3(o);
Console.WriteLine(v3);
v4 = getter4(o);
Console.WriteLine(v4);
//=======================================================================================
var setter4 = DynamicPropertyAccessor.CreateSetPropertyValueAction<string>(typeName, "f1");
setter4(o, "MNOP");
v3 = getter3(o);
Console.WriteLine(v3);
v4 = getter4(o);
Console.WriteLine(v4);
//=======================================================================================
Console.ReadLine();
}
}
}
namespace Test.Share
{
using System.Threading;
public class ComplexType
{
public string F1
{
get;
set;
}
public static string _f2;
public static string F2
{
get
{
return _f2;
}
set
{
Interlocked.Exchange<string>(ref _f2, value);
}
}
}
}
namespace Microshaoft
{
using System;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
public class DynamicPropertyAccessor
{
private static Assembly GetAssemblyByTypeName(string typeName)
{
return AppDomain.CurrentDomain.GetAssemblies().First
(
(a) =>
{
return a.GetTypes().Any
(
(t) =>
{
return (t.FullName == typeName);
}
);
}
);
}
public static Func<object, object> CreateGetPropertyValueFunc(string typeName, string propertyName, bool isTypeFromAssembly = false)
{
Type type;
if (isTypeFromAssembly)
{
var assembly = GetAssemblyByTypeName(typeName);
type = assembly.GetType(typeName);
}
else
{
type = Type.GetType(typeName);
}
return CreateGetPropertyValueFunc(type, propertyName);
}
public static Func<object, object> CreateGetPropertyValueFunc(Type type, string propertyName)
{
var target = Expression.Parameter(typeof(object));
var castTarget = Expression.Convert(target, type);
var getPropertyValue = Expression.Property(castTarget, propertyName);
var castPropertyValue = Expression.Convert(getPropertyValue, typeof(object));
var lambda = Expression.Lambda<Func<object, object>>(castPropertyValue, target);
return lambda.Compile();
}
public static Func<object, TProperty> CreateGetPropertyValueFunc<TProperty>(string typeName, string propertyName, bool isTypeFromAssembly = false)
{
Type type;
if (isTypeFromAssembly)
{
var assembly = GetAssemblyByTypeName(typeName);
type = assembly.GetType(typeName);
}
else
{
type = Type.GetType(typeName);
}
return CreateGetPropertyValueFunc<TProperty>(type, propertyName);
}
public static Func<object, TProperty> CreateGetPropertyValueFunc<TProperty>(Type type, string propertyName)
{
var target = Expression.Parameter(typeof(object));
var castTarget = Expression.Convert(target, type);
var getPropertyValue = Expression.Property(castTarget, propertyName);
var lambda = Expression.Lambda<Func<object, TProperty>>(getPropertyValue, target);
return lambda.Compile();
}
public static Func<TProperty> CreateGetStaticPropertyValueFunc<TProperty>(string typeName, string propertyName, bool isTypeFromAssembly = false)
{
Type type;
if (isTypeFromAssembly)
{
var assembly = GetAssemblyByTypeName(typeName);
type = assembly.GetType(typeName);
}
else
{
type = Type.GetType(typeName);
}
return CreateGetStaticPropertyValueFunc<TProperty>(type, propertyName);
}
public static Func<TProperty> CreateGetStaticPropertyValueFunc<TProperty>(Type type, string propertyName)
{
Func<TProperty> func = null;
var property = type.GetProperty(propertyName, typeof(TProperty));
if (property == null)
{
property = type.GetProperties().ToList().FirstOrDefault
(
(x) =>
{
return
(x.Name.ToLower() == propertyName.ToLower());
}
);
}
if (property != null)
{
var getPropertyValue = Expression.Property(null, property);
var lambda = Expression.Lambda<Func<TProperty>>(getPropertyValue, null);
func = lambda.Compile();
}
return func;
}
public static Func<object> CreateGetStaticPropertyValueFunc(Type type, string propertyName)
{
Func<object> func = null;
var property = type.GetProperty(propertyName);
if (property == null)
{
property = type.GetProperties().ToList().FirstOrDefault
(
(x) =>
{
return
(x.Name.ToLower() == propertyName.ToLower());
}
);
}
if (property != null)
{
var getPropertyValue = Expression.Property(null, property);
var castPropertyValue = Expression.Convert(getPropertyValue, typeof(object));
var lambda = Expression.Lambda<Func<object>>(castPropertyValue, null);
func = lambda.Compile();
}
return func;
}
public static Func<object> CreateGetStaticPropertyValueFunc(string typeName, string propertyName, bool isTypeFromAssembly = false)
{
Type type;
if (isTypeFromAssembly)
{
var assembly = GetAssemblyByTypeName(typeName);
type = assembly.GetType(typeName);
}
else
{
type = Type.GetType(typeName);
}
return CreateGetStaticPropertyValueFunc(type, propertyName);
}
public static Action<object, object> CreateSetPropertyValueAction(Type type, string propertyName)
{
Action<object, object> action = null;
var property = type.GetProperty(propertyName);
if (property == null)
{
property = type.GetProperties().ToList().FirstOrDefault
(
(x) =>
{
return
(x.Name.ToLower() == propertyName.ToLower());
}
);
}
if (property != null)
{
var target = Expression.Parameter(typeof(object));
var propertyValue = Expression.Parameter(typeof(object));
var castTarget = Expression.Convert(target, type);
var castPropertyValue = Expression.Convert(propertyValue, property.PropertyType);
var getSetMethod = property.GetSetMethod();
if (getSetMethod == null)
{
getSetMethod = property.GetSetMethod(true);
}
var call = Expression.Call(castTarget, getSetMethod, castPropertyValue);
var lambda = Expression.Lambda<Action<object, object>>(call, target, propertyValue);
action = lambda.Compile();
}
return action;
}
public static Action<object, object> CreateSetPropertyValueAction(string typeName, string propertyName, bool isTypeFromAssembly = false)
{
Type type;
if (isTypeFromAssembly)
{
var assembly = GetAssemblyByTypeName(typeName);
type = assembly.GetType(typeName);
}
else
{
type = Type.GetType(typeName);
}
return CreateSetPropertyValueAction(type, propertyName);
}
public static Action<object, TProperty> CreateSetPropertyValueAction<TProperty>(Type type, string propertyName)
{
Action<object, TProperty> action = null;
var property = type.GetProperty(propertyName);
if (property == null)
{
property = type.GetProperties().ToList().FirstOrDefault
(
(x) =>
{
return
(x.Name.ToLower() == propertyName.ToLower());
}
);
}
if (property != null)
{
var target = Expression.Parameter(typeof(object));
var propertyValue = Expression.Parameter(typeof(TProperty));
var castTarget = Expression.Convert(target, type);
var castPropertyValue = Expression.Convert(propertyValue, property.PropertyType);
var getSetMethod = property.GetSetMethod();
if (getSetMethod == null)
{
getSetMethod = property.GetSetMethod(true);
}
var call = Expression.Call(castTarget, getSetMethod, castPropertyValue);
var lambda = Expression.Lambda<Action<object, TProperty>>(call, target, propertyValue);
action = lambda.Compile();
}
return action;
}
public static Action<object, TProperty> CreateSetPropertyValueAction<TProperty>(string typeName, string propertyName, bool isTypeFromAssembly = false)
{
Type type;
if (isTypeFromAssembly)
{
var assembly = GetAssemblyByTypeName(typeName);
type = assembly.GetType(typeName);
}
else
{
type = Type.GetType(typeName);
}
return CreateSetPropertyValueAction<TProperty>(type, propertyName);
}
public static Action<object> CreateSetStaticPropertyValueAction(Type type, string propertyName)
{
Action<object> action = null;
var property = type.GetProperty(propertyName);
if (property == null)
{
property = type.GetProperties().ToList().FirstOrDefault
(
(x) =>
{
return
(x.Name.ToLower() == propertyName.ToLower());
}
);
}
if (property != null)
{
var propertyValue = Expression.Parameter(typeof(object));
var castPropertyValue = Expression.Convert(propertyValue, property.PropertyType);
var getSetMethod = property.GetSetMethod();
if (getSetMethod == null)
{
getSetMethod = property.GetSetMethod(true);
}
var call = Expression.Call(null, getSetMethod, castPropertyValue);
var lambda = Expression.Lambda<Action<object>>(call, propertyValue);
action = lambda.Compile();
}
return action;
}
public static Action<object> CreateSetStaticPropertyValueAction(string typeName, string propertyName, bool isTypeFromAssembly = false)
{
Type type;
if (isTypeFromAssembly)
{
var assembly = GetAssemblyByTypeName(typeName);
type = assembly.GetType(typeName);
}
else
{
type = Type.GetType(typeName);
}
return CreateSetStaticPropertyValueAction(type, propertyName);
}
public static Action<TProperty> CreateSetStaticPropertyValueAction<TProperty>(Type type, string propertyName)
{
Action<TProperty> action = null;
var property = type.GetProperty(propertyName);
if (property == null)
{
property = type.GetProperties().ToList().FirstOrDefault
(
(x) =>
{
return
(x.Name.ToLower() == propertyName.ToLower());
}
);
}
if (property != null)
{
var propertyValue = Expression.Parameter(typeof(TProperty));
//var castPropertyValue = Expression.Convert(propertyValue, property.PropertyType);
var getSetMethod = property.GetSetMethod();
if (getSetMethod == null)
{
getSetMethod = property.GetSetMethod(true);
}
var call = Expression.Call(null, getSetMethod, propertyValue);
var lambda = Expression.Lambda<Action<TProperty>>(call, propertyValue);
action = lambda.Compile();
}
return action;
}
public static Action<TProperty> CreateSetStaticPropertyValueAction<TProperty>(string typeName, string propertyName, bool isTypeFromAssembly = false)
{
Type type;
if (isTypeFromAssembly)
{
var assembly = GetAssemblyByTypeName(typeName);
type = assembly.GetType(typeName);
}
else
{
type = Type.GetType(typeName);
}
return CreateSetStaticPropertyValueAction<TProperty>(type, propertyName);
}
}
}
|