z-man wrote:
// Java version -----------------------------------
public String getName()
{
// Doesn't work! What's the equivalent syntax?
return getEntry<String,MyStringType>("name");
return this.<String,MyStringType>getEntry("name");
}
public void setName(
String value
)
{
// Doesn't work! What's the equivalent syntax?
setEntry<String,MyStringType>("name",value);
return this.<String,MyStringType>setEntry("name",value);
}
protected T <T,TBase extends MyBaseType<T>> getEntry(
String key
)
{
try{return (T)((TBase)entries.get(key))).getValue();}
catch{return default(T);}
}
protected void <T,TBase extends MyBaseType<T>> setEntry(
String key,
T value
)
{
if(!entries.containsKey(key))
entries.set(key,new TBase());
((TBase)entries.get(key))).setValue(value);
}
But all this won't work together in Java, because of erasure...
I think you need something like this:
public class YourCSharpPort {
public String getName() {
return getEntry("name", MyStringType.class);
}
public void setName(String value) {
setEntry("name", MyStringType.class, value);
}
Map<String, Object> entries;
protected <T, TBase extends MyBaseType<T>>
T getEntry(
String key, Class<TBase> typeOfTBase) {
TBase holder = typeOfTBase.cast(entries.get(key));
return holder != null ? holder.getValue() : null;
}
protected <T, TBase extends MyBaseType<T>>
void setEntry(
String key, Class<TBase> typeOfTBase,
T value) {
TBase holder = typeOfTBase.cast(entries.get(key));
if (holder == null && !entries.containsKey(key))
entries.put(key, holder = newInstanceOf(typeOfTBase));
holder.setValue(value);
}
protected <T> T newInstanceOf(Class<T> typeOfT) {
try {
return typeOfT.newInstance();
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
HTH,
piotr