我想将我的许多表更改为查询表。
我有类型和方法。我要配对。
emitTraceInfo
我必须创建一个if (propertyType == typeof(bool) || propertyType == typeof(bool?))
DoBool(propertyType);
if (propertyType == typeof(DateTime) || propertyType == typeof(DateTime?))
DoDateTime(propertyType);
if (propertyType == typeof(Guid) || propertyType == typeof(Guid?))
DoGuid(propertyType);
吗?还是最优雅的方式做到这一点?
您能给我一些建议,从哪里开始或在哪里找到解决方案?
答案 0 :(得分:1)
由于这比单纯的查找更多的是控制代码流,所以我可能会使用一种面向对象的方法,并将每个“处理程序”的代码放在单独的类中(在基类中包含一些普通的东西)。
您可以创建一个通用界面,例如
Function Excel-Write{
$RD = "C:\temp\Servers\*.csv"
$CsvDir = $RD
$csvs = dir -path $CsvDir
$outputxls = ""C:\temp\Servers\Complete.Xlsx"
$Excel = New-Object -ComObject excel.application
$workbook = $excel.Workbooks.add(1)
foreach($iCsv in $csvs){
$WB = $csvs.Length
#$Excel.displayAlerts = $false
$Worksheet = $workbook.worksheets.add(1)
$Worksheet.name = $Group
$TxtConnector = ("TEXT;" + $iCsv)
$Connector = $worksheet.Querytables.add($txtconnector,$worksheet.Range("A1"))
$query = $Worksheet.QueryTables.item($Connector.name)
$query.TextfileOtherDelimiter = $Excel.Application.International(5)
$Query.TextfileParseType =1
$Query.TextFileColumnDataTypes = ,2 * $worksheet.cells.column.count
$query.AdjustColumnWidth =1
$Query.Refresh()
$Query.Delete()
$workbook.Save()
}
$Workbook.SaveAs($outputxls,51)
$Excel.quit()
}
...,然后根据需要将处理程序的实现放到类型为public interface ITypeHandler {
void HandleType(Type type);
}
的字典中,或者可以在接口上有一个属性来显示其处理的类型,然后从列表中选择(也许是Dependency基于此属性的注入的处理程序。
这增加了好处,例如关注点分离,可测试性等。
(请注意,* Handler不是一个很好的名字,您将不得不根据所涉及的场景创建一个更好的名字。)
答案 1 :(得分:0)
您可以创建一个pip install tensorflow-transform
:
Dictionary<Type, Action<Type>>
然后这样称呼它:
var dict = new Dictionary<Type, Action<Type>>() {
{typeof(bool), DoBool},
{typeof(bool?), DoBool},
{typeof(DateTime), DoDateTime},
{typeof(Datetime?), DoDateTime},
{typeof(Guid), DoGuid},
{typeof(Guid?), DoGuid}
};
答案 2 :(得分:0)
您可以创建一种方法来初始化具有指定类型的查找表,以避免重复。
private readonly IDictionary<Type, Action<Type>> _lookup;
然后,您可以定义用于初始化_dict
的方法,
private void AddEntry<T>(Action<Type> action) where T : struct
{
_lookup[typeof(T)] = action;
_lookup[typeof(Nullable<T>)] = action;
}
private void DoInt(Type type) { /* implementation */ }
AddEntry<bool>(type => { /* implementation */ });
AddEntry<int>(DoInt);
答案 3 :(得分:0)
我创建了自己的实现,该实现稍有不同,但是我使用了@DaggeJ建议,非常感谢!
首先,我创建了一个基本处理程序类。之后,我在不同的类型类上使用了此基础。您可以在下面看到它。
BaseClass:
public abstract class QueryHandler<T> where T : class
{
//I added here more property.
public abstract Type[] Types { get; }
protected QueryHandler(//Properties)
{
//Properties null check
}
public abstract IQueryable<T> Handle();
}
后代:
internal class GuidQuery<T> : QueryHandler<T> where T : class
{
public override Type[] Types => new Type[] { typeof(Guid), typeof(Guid?) };
public GuidQuery(//Properties) : base(//Properties)
{
}
public override IQueryable<T> Handle()
{
// Implementation
}
}
用法:
public IQueryable<T> GetQuery()
{
var queryHandlerList = new List<QueryHandler<T>>()
{
new IntQuery<T>(//Properties),
new DateTimeQuery<T>(//Properties),
new StringQuery<T>(//Properties),
new BoolQuery<T>(//Properties),
new GuidQuery<T>(//Properties),
new EnumQuery<T>(//Properties)
};
}
return query = queryHandlerList.FirstOrDefault(h => GetType<T>(h, property.PropertyType)).Handle();
private bool GetType<T>(QueryHandler<T> handler, Type type) where T: class
{
if (handler.Types.FirstOrDefault(t => t == type) == type || handler.Types.FirstOrDefault(t => t == type.BaseType) == type.BaseType) return true;
return false;
}