I have two auto-generated classes, say Type1 and Type2. Each of these classes deals with other related auto-generated classes. Since they are auto-generated, I cannot change them to use either abstract classes or interfaces. I have two methods, one return Type1 and the other return Type2. Type1 and Type2 are almost the same, so I wanted to call them like below to avoid code duplication on my side, of course it did not work as the type needs to be known in compile time.
var response = string.IsNullOrWhiteSpace(inputObject.HistoricYear) ? Type1: Type2;
if (string.IsNullOrWhiteSpace(inputObject.HistoricYear))
{
response = TsiService.GetAccountTransactionsList(inputObject);
} else
{
response = TsiService.GetAccountTransactionsHist(inputObject);
}
I also tried using object
and then I get this error object does not contain a definition for MEMBER_1 and MEMBER_2, etc.
:
var response = null;
if (string.IsNullOrWhiteSpace(inputObject.HistoricYear))
{
response = TsiService.GetAccountTransactionsList(inputObject);
} else
{
response = TsiService.GetAccountTransactionsHist(inputObject);
}
CustomObject.member1 = response.MEMBER_1;
CustomObject.member2 = response.MEMBER_2;
Any idea how to do it?
CodePudding user response:
The canonical solution would be to make sure that both Type1
and Type2
implement a common interface defining MEMBER_1
, MEMBER_2
, etc.
Since you cannot do that for technical reasons, you have two options:
Create wrapper types: Create a new class
Type1WithInterface
, which has the same members asType1
, but also implements that common interface described above.Type1WithInterfaces
gets aType1
instance in its constructor and passes every property access to the underlyingType1
.Alternatively, you can use the
dynamic
keyword. It disables compile-time type checks for member accesses.
The drawback of option 1 is that you will have to write a lot of boiler-plate code, but the advantage is that you will retain type safety. With option 2, all type safety bets are off, and typos will bite you at run-time rather than at compile-time.
CodePudding user response:
You can't use var
in this way, since it is necessary that the type be known at the time of compilation. Just change it to object
, because all of the types inherit from it. You can also use dynamic
but I strongly don't recommend you to do it.