如何使用泛型使用工厂构建器创建子 class 的实例?
How to create an instance of a child class with a factory builder using generics?
我正在尝试使用来自父级的工厂生成器创建 class 的实例。
用例基本上是一个库,其中包含继承自同一个 class 的一系列 classes。
主要目标是减少 classes.
中的代码量
我有一个包含两个值的接口,IDualValues<T>
。
public interface IDualValues<T>
{
public T FirstValue { get; }
public T SecondValue { get; }
}
这是所有 classes 的示例(更改方法名称)。
public class Foo : IDualValues<string>
{
public string FirstValue { get; }
public string SecondValue { get; }
public Foo(string firstValue, string secondValue)
{
FirstValue = firstValue;
SecondValue = secondValue;
}
public static Foo Create(string firstValue, string secondValue)
{
return new Foo(firstValue, secondValue);
}
}
我的观点是,我想使用 FactoryBuilder 来做 Foo.Create
而不是直接在客户端应用程序中创建新实例。
理想情况下会有一个父级 class 包含所有逻辑:
public class DualValuesBuilder<T, CreatedType> : IDualValues<T>
where CreatedType : class, IDualValues<T>
{
public T FirstValue { get; init; }
public T SecondValue { get; init; }
private DualValuesBuilder(T firstValue, T secondValue)
{
FirstValue = firstValue;
SecondValue = secondValue;
}
public static CreatedType Create(T firstValue, T secondValue)
{
//Creation here
}
}
其他 classes 将是空的 classes 只是实现了那个:
public class Foo : DualValuesBuilder<string, Foo>
{
}
请注意,我将 class 本身作为通用参数发送给“构建器”。
为了实现我的目标,我创建了一个“助手”class 来构建一个继承自 IDualValues<T>
的 class。
public class DualValuesBuilderHelper<T> : IDualValues<T>
{
public T FirstValue { get; init;}
public T SecondValue { get; init; }
private DualValuesBuilderHelper(T firstValue, T secondValue)
{
FirstValue = firstValue;
SecondValue = secondValue;
}
public static IDualValues<T> Create<ReturnType>(T developerK8SClusterValue, T octopusValue)
where ReturnType : IDualValues<T>
{
return new DualValuesBuilderHelper<T>(developerK8SClusterValue, octopusValue);
}
}
然后我更新了 class DualValuesBuilder
中的 Create
方法,使其看起来像下一个:
public static CreatedType Create(T firstValue, T secondValue)
{
return (CreatedType)DualValuesBuilderHelper<T>.Create<CreatedType>(firstValue, secondValue);
}
但这给了我一个转换错误:
System.InvalidCastException: Unable to cast object of type 'DualValuesBuilderHelper
1[System.String]' 键入 'Foo'.`
这里有一个fiddle,代码是:https://dotnetfiddle.net/IUrgr1
是的,如果我做了以下工作,但这不是我想要实现的。
Foo foo = new Foo()
{
FirstValue = "f1",
SecondValue = "f2"
};
注意:使用构造器也可以,但我需要让它与 Create
一起工作。
即使我创建了显式(或隐式)运算符,转换仍在进行。
我是不是想多了,有一种简单的方法可以完成我想做的事情吗?
还是无法做到?
谢谢。
已更新,因为我错过了继承工厂方法的细微差别。
主要是将 new()
添加到通用约束中将解决您的问题,并且包括 CreateType
必须是 DualValuesBuilder
的子项:where CreateType : DualValuesBuilder<CreateType, DataType>, new()
public interface IDualValues<T>
{
public T FirstValue { get; init; }
public T SecondValue { get; init; }
}
public class Foo : DualValuesBuilder<Foo, string>
{
}
public class Foo2 : DualValuesBuilder<Foo2, int>
{
}
public class DualValuesBuilder<CreateType, DataType> : IDualValues<DataType>
where CreateType : DualValuesBuilder<CreateType, DataType>, new()
{
public DataType FirstValue { get; init; }
public DataType SecondValue { get; init; }
public static CreateType Create(DataType firstValue, DataType secondValue)
{
return new CreateType
{
FirstValue = firstValue,
SecondValue = secondValue
};
}
}
主要是将 new()
添加到通用约束中将使您得到解决:where CreatedType : class, IDualValues<T>, new()
public interface IDualValues<T>
{
public T FirstValue { get; init; }
public T SecondValue { get; init; }
}
public class Foo : IDualValues<string>
{
public string FirstValue { get; init; }
public string SecondValue { get; init; }
}
public static class DualValuesBuilder
{
public static CreateType Create<CreateType, DataType>(
DataType firstValue,
DataType secondValue)
where CreateType : class, IDualValues<DataType>, new()
{
return new CreateType
{
FirstValue = firstValue,
SecondValue = secondValue
};
}
}
我正在尝试使用来自父级的工厂生成器创建 class 的实例。
用例基本上是一个库,其中包含继承自同一个 class 的一系列 classes。 主要目标是减少 classes.
中的代码量我有一个包含两个值的接口,IDualValues<T>
。
public interface IDualValues<T>
{
public T FirstValue { get; }
public T SecondValue { get; }
}
这是所有 classes 的示例(更改方法名称)。
public class Foo : IDualValues<string>
{
public string FirstValue { get; }
public string SecondValue { get; }
public Foo(string firstValue, string secondValue)
{
FirstValue = firstValue;
SecondValue = secondValue;
}
public static Foo Create(string firstValue, string secondValue)
{
return new Foo(firstValue, secondValue);
}
}
我的观点是,我想使用 FactoryBuilder 来做 Foo.Create
而不是直接在客户端应用程序中创建新实例。
理想情况下会有一个父级 class 包含所有逻辑:
public class DualValuesBuilder<T, CreatedType> : IDualValues<T>
where CreatedType : class, IDualValues<T>
{
public T FirstValue { get; init; }
public T SecondValue { get; init; }
private DualValuesBuilder(T firstValue, T secondValue)
{
FirstValue = firstValue;
SecondValue = secondValue;
}
public static CreatedType Create(T firstValue, T secondValue)
{
//Creation here
}
}
其他 classes 将是空的 classes 只是实现了那个:
public class Foo : DualValuesBuilder<string, Foo>
{
}
请注意,我将 class 本身作为通用参数发送给“构建器”。
为了实现我的目标,我创建了一个“助手”class 来构建一个继承自 IDualValues<T>
的 class。
public class DualValuesBuilderHelper<T> : IDualValues<T>
{
public T FirstValue { get; init;}
public T SecondValue { get; init; }
private DualValuesBuilderHelper(T firstValue, T secondValue)
{
FirstValue = firstValue;
SecondValue = secondValue;
}
public static IDualValues<T> Create<ReturnType>(T developerK8SClusterValue, T octopusValue)
where ReturnType : IDualValues<T>
{
return new DualValuesBuilderHelper<T>(developerK8SClusterValue, octopusValue);
}
}
然后我更新了 class DualValuesBuilder
中的 Create
方法,使其看起来像下一个:
public static CreatedType Create(T firstValue, T secondValue)
{
return (CreatedType)DualValuesBuilderHelper<T>.Create<CreatedType>(firstValue, secondValue);
}
但这给了我一个转换错误:
System.InvalidCastException: Unable to cast object of type 'DualValuesBuilderHelper
1[System.String]' 键入 'Foo'.`
这里有一个fiddle,代码是:https://dotnetfiddle.net/IUrgr1
是的,如果我做了以下工作,但这不是我想要实现的。
Foo foo = new Foo()
{
FirstValue = "f1",
SecondValue = "f2"
};
注意:使用构造器也可以,但我需要让它与 Create
一起工作。
即使我创建了显式(或隐式)运算符,转换仍在进行。
我是不是想多了,有一种简单的方法可以完成我想做的事情吗? 还是无法做到?
谢谢。
已更新,因为我错过了继承工厂方法的细微差别。
主要是将 new()
添加到通用约束中将解决您的问题,并且包括 CreateType
必须是 DualValuesBuilder
的子项:where CreateType : DualValuesBuilder<CreateType, DataType>, new()
public interface IDualValues<T>
{
public T FirstValue { get; init; }
public T SecondValue { get; init; }
}
public class Foo : DualValuesBuilder<Foo, string>
{
}
public class Foo2 : DualValuesBuilder<Foo2, int>
{
}
public class DualValuesBuilder<CreateType, DataType> : IDualValues<DataType>
where CreateType : DualValuesBuilder<CreateType, DataType>, new()
{
public DataType FirstValue { get; init; }
public DataType SecondValue { get; init; }
public static CreateType Create(DataType firstValue, DataType secondValue)
{
return new CreateType
{
FirstValue = firstValue,
SecondValue = secondValue
};
}
}
主要是将 new()
添加到通用约束中将使您得到解决:where CreatedType : class, IDualValues<T>, new()
public interface IDualValues<T>
{
public T FirstValue { get; init; }
public T SecondValue { get; init; }
}
public class Foo : IDualValues<string>
{
public string FirstValue { get; init; }
public string SecondValue { get; init; }
}
public static class DualValuesBuilder
{
public static CreateType Create<CreateType, DataType>(
DataType firstValue,
DataType secondValue)
where CreateType : class, IDualValues<DataType>, new()
{
return new CreateType
{
FirstValue = firstValue,
SecondValue = secondValue
};
}
}